利用SPSS消除录入误差的方法
利用SPSS 消除录入误差的方法
一、统计分析中的录入误差
任何一项社会调查都不可能完全准确地描述社会生活的原貌,也就是说不论采用什么样的方法,调查误差总是存在的。但调查的误差应当是越小越好。只有把误差控制在调查精度要求的范围之内,调查才是有价值的。
如果调查的样本是一个随机样本,则误差主要来自两个方面:一是工作误差,二是随机误差。从理论上说,随机误差可以通过扩大样本来减少。样本越大,随机误差就越小;样本等于总体时,随机误差为零。工作误差包括三方面:一是登记误差,二是录入误差,三是计算误差。使用计算机进行统计分析能基本上消除计算误差。登记误差是指调查员在登记调查表时的错误登记,或是被调查者在填写问卷时的错误填答。这部分误差是无法计算的,也没有什么技术手段可以消除,只能通过选择高水平的访问员,加强培训,制定严格的规范,进行严格的督导等手段来尽可能地减少。录入误差是指在计算机录入时,由于录入错误造成的误差。在计算机录入的过程中,录入误差是不可避免的。每个人不论其工作的精确度多么高,都会或多或少地产生错误。根据我们的经验,一个人的录入错误率平均说来约为1%左右。如果某次调查的样本数为1000,每份问卷中包含100个变量的话,录入的错误数据将为1000*100*1%=1000个左右。这些错误的数据如果不被剔除的话,将会严重影响计算结果的准确性。尤其是一些远离数据有效取值范围的离群值对计算结果的干扰性更大。因此,做定量分析的研究者都非常重视数据录入的准确性。
二、减少录入误差的常用方法及其缺点
目前社会学界采用的减少录入误差的方法主要有校对法与非法值检验法,但这两种方法都存在一些问题。下面我们分别加以
分析。
1. 校对法
校对法是多年来一直使用的方法,是在数据录入计算机之后,由录入员或研究人员将原始资料与计算机中的资料一一对比地进行校对。这种方法的缺点是:第一,精确性低。校对仍然是人工性的工作,由于工作人员的工作态度、身体状况、技术水平等多方面原因,校对工作中人的工作误差仍难以避免。同时,长时间的校对所造成的视觉疲劳也会大大降低校对的精度。经过一次校对,根本不能达到消除录入误差的目的。因此,对于精确度要求很高的调查来说,要进行二校甚至三校。即使进行多次校对之后,到底还剩下多少错误录入的数据,研究者和录入者心里并不清楚。第二,花费时间长。校对一次所花费的时间与录入一次所花费的时间基本相同。有时甚至比录入花费的时间还要长。第三,成本高。校对一次所花费的人力与录入一次基本相同,如果为保证精度的需要而进行二校甚至三校的话,需要花费的人力和时间就更多。这样做的结果,是大大增加了录入成本。
2. 非法值检验法
社会调查中的任何一个变量都有着确定性的取值范围。在取值范围之内的数据称为合法值,而在取之范围之外的数据称为非法值。如果录入的数据值是在合法的取值范围之外,这个数据就被视为非法数据。通过检查某一个数据是否在合法的取值范围内,可以部分地确定该数据的录入是否正确。用SPSS 制作一个变量的频数分布表,可以看出该变量录入了多少个非法值。如果将数据库根据此变量进行排序,则可以将该变量录入了非法值的个案集中起来进行修改。这种检验和纠错的方法跟校对法相比,由于省去了一一对比的过程,能节省很多人力和时间。但这样做的结果只是找到了在合法值取值范围以外的录入错误。如果录入的错误数据在合法值的取值范围之内,用这种方法就无法检查出来。
三、利用SPSS 消除录入误差的方法
1. 基本思想
笔者在用SPSS 进行录入和统计分析的过程中摸索出了一套操作简单,行之有效的减少甚至基本消除录入误差的方法。 利用SPSS 消除录入误差的方法可以概括为八个字:并行录入,对比纠错。并行录入是指:问卷统一编号以后,由两名录入员按照同样的数据表格式各录入一次。对比纠错是指:将两个人录入的同一个数据进行对比,如果相同则认为两个人的录入都正确;如果不同,则至少有一个人的录入是错误的,需要对照问卷纠错。用这种方法很容易找到录入错误的数值,且由于对比过程可以由计算机来实现,不仅省去了一一校对的麻烦,而且大大提高了纠错的精确性。
2. 实际操作过程 (1)并行录入
在录入前必须把所有的问卷编号,使每一份问卷有一个唯一号。在录入时,问卷编号必须作为一个变量录入计算机。并行录入时,要求两位录入员所用的变量名、变量的各种设置、变量名标签(lable )、变量值标签(values )等必须完全相同。最好的方法是变量制作完以后,以不同的文件名拷贝成两分,由两位录入员使用变量设置完全相同的数据文件进行录入。录入结束后,应按照问卷编号对数据进行排序。
(2)对比纠错
假如是A 、B 两个人进行录入。把A 录入的数据文件称为文件A ,B 录入的称为文件B 。对比纠错的过程是:先在文件A 所有变量名的后面加一个共同的字符,在文件B 所有变量名的后面加另一个共同的字符。这样既使文件B 的变量名与文件A 的变量名相区别,又便于对两个文件中相应的变量作比较。作此修改后,将文件B 的全部数据以添加变量的方式添加到文件A 中(用SPSS 中的Merge Files功能中的Add Variables 指令)。这样在文件A 中的变量数就成为原来的两倍,而且每一个变量都有一个变量名只相差一个字符的另一个变量与之相对应。然后用SPSS 中Transform 的下拉菜单中的Compute 指令。在Compute 对话框中把每对相互对应的变量进行比较,并以比较的结果生成新的变量。我们把这个新变量称为纠错变量。在纠错变量的取值中,只有缺失和1两种情况。当两个人录入的值相同时,纠错变量的值设为缺失。当两个人录入的值不同时,纠错变量的值为1。根据这
个1在SPSS 数据窗口中的位置,很容易找到生成这个纠错变量的原变量,进而确定错误录入的位置。并根据这个1所对应的问卷编号找到该份问卷,来纠正录入错误。
四、用SPSS 实现计算机自动对比数据的方法
上面介绍的手工操作过程对于变量数少,个案数多的数据文件应用起来比较方便。如果变量数很多,手工操作仍很麻烦。为此,我们编制了几个简单的SPSS 程序,以简化对比纠错的过程。下面介绍纠错的方法并给出所用的程序。
本方法的程序由三部分构成:(1)预程序;(2)主程序;(3)附加程序。三个程序均在SPSS 的Syntax 窗口中运行。其中主程序的基本思想与上述的手工操作的思路一致,即:对独立录入但结构相同的两份数据文件A 与B 的变量名略作变化后,用Merge Files 指令加以合并,将源自A 的数据一一跟源自B 的相应数据进行对比,生成一个纠错变量。纠错变量的值标示出A 与B 的数据是否相符,这样便可以对照原始问卷对不相符的地方进行纠错。
主程序还具有如下功能:(1)自动使A 中每一个变量与B 中相应的变量及通过二者对比生成的纠错变量相邻,从而使对照问卷纠错时方便得多。(2)对多种变量类型(如数值型、文字型、日期型变量)都能一次性地自动进行比较并生成相应的纠错变量。
对照问卷纠错的工作结束后,可以运行附加程序,使数据文件恢复到原先的结构,即只保留纠正过的数据文件的变量,而去掉来自另一文件的变量与纠错变量。
在变量很多的情况下,主程序与附加程序都会包含大量的指令行。这些指令如果都手工编写,一是工作量大,二是容易因疏忽而出错。预程序的作用,是根据数据文件的Dictionary 中的变量名称与变量类型的信息,自动写出主程序与预程序所需的绝大多数指令行,只需在预程序输出结果的基础上略加编辑,就可形成主程序与附加程序。
五、用SPSS 实现计算机自动对比数据的操作过程
1. 运行该程序的条件
运行下面给出的程序时,要求用户必须做到以下四点:
(1)要对比的两个数据文件必须有完全相同的变量名和变量类型;
(2)两个数据文件的个案(Case )数及其顺序必须相同(因为如果计算机将不同的个案进行比较,将会标出很多“错误”),这可以通过用上面第三部分介绍的手工操作方法先对问卷编号这一变量进行检查来实现;
(3)这两个文件必须均在计算机C 盘的根目录下,文件名分别为Data1.sav 与Data2.sav (如果数据文件名或其所在位置不同,就需要对下面程序中所用的数据文件的名称与路径作相应的修改);
(4)两个数据文件中每个变量的变量名不能超过19个字节(每个汉字相当于2个字节)。
作第四条要求,是想让整个对比纠错过程中来自Data1.sav 和Data2.sav 的变量及纠错变量的变量名长度不超过20。如果Data1.sav 和Data2.sav 中有名称更长的变量,需要对下面的程序作适当调整,将第四条要求放宽到变量名不超过63字节,而整个纠错过程中有关变量名不超过64字节(SPSS15.0允许的最长的变量名)。之所以保留一个字节,是因为,为了确保在SPSS 自动执行Merge Files操作及生成纠错变量时不会出现相同的变量名,计算机在执行下面程序的过程中,自动将Data1.sav 中的变量名都加上“1”的后缀,将Data2.sav 中的变量名都加上“2”的后缀,而纠错变量的变量名统一由原数据文件中的变量名加上“3”的后缀生成,这样就能保证变量名不会相重。
下面,我们给出实际的程序及操作。为叙述简单起见,我们假定Data1.sav 与Data2.sav 只有六个变量,即Numeric_A、String_B、Date_C及“数值型变量D ”、“字符型变量E ”、“日期型变量F ”组成,其中Numeric_A与“数值型变量第四”为数值型变量,String_B与“字符型变量第五”为字符型变量,而Date_C与“日期型变量第六”为日期型变量。当然,一个实际的数据文件的变量数一般会多得多,但这只影响到下面程序中用粗体字标出的部分——每增加一个变量每个粗体部分的指令便会相应地增加一行。
2. 预程序的生成及运行
在SPSS 中打开数据文件Data1.sav ,在File 下拉菜单中选择New ,在弹出菜单中选择Syntax ,这时会出现一个SPSS 的Syntax 编辑窗口(Syntax1)。在此窗口中输入如下指令:
=====================================================================
display variables.
---------------------------------------------------------------------
运行此指令(在Run 的下拉菜单中选择All ),这时会出现一个显示运行结果的窗口Output1,其中有下面这个目标:
=====================================================================
Measurement
Variable Numeric_A String_B Date_C 数值型变量D 字符型变量E 日期型变量F
Position
Label
Level Scale Nominal Scale Scale Nominal Scale
Print Format Write Format F8.2 A8 ADATE8 F8.2 A8 ADATE10
F8.2 A8 ADATE8 F8.2 A8 ADATE10
Variable Information
1 2 3 4 5 6
Variables in the working file
---------------------------------------------------------------------
将此目标拷到一个Word 文档中,删掉表格之外的文字及表格中除V ariable 和Measurement Level外的所有列,再删掉第一行,得到如下结果:
===================================================================== Numeric_A String_B
Scale Nominal
Date_C 数值型变量D 字符型变量E 日期型变量F
Scale Scale Nominal Scale
---------------------------------------------------------------------
在SPSS 中打开一个新的数据窗口,将其第一和第二个变量分别设为长度为20和8的字符型(String )变量(变量名可接受SPSS 自动生成的V AR00001和V AR00002),而后在数据编辑窗口下将上面删除冗余信息后的表中的数据拷贝到此数据窗口中,再在SPSS 中将这些数据全部选中,拷回到Word 中,得到如下结果:
===================================================================== Numeric_A Scale String_B Nominal Date_C Scale 数值型变量D 字符型变量E 日期型变量F
Scale Nominal Scale
---------------------------------------------------------------------
再增加一些指令行,编辑成如下的预程序:
===================================================================== data list notable / vn 1-19 (a) vt 26-32 (a). begin data
Numeric_A Scale String_B Nominal
Date_C Scale 数值型变量D 字符型变量E 日期型变量F end data.
string vn1 vn2 vn3 (a20).
compute vn1=concat(rtrim(vn, " "), "1"). compute vn2=concat(rtrim(vn, " "), "2"). compute vn3=concat(rtrim(vn, " "), "3"). string v1 v2 v3 (a40).
compute v1=concat(rtrim(vn, " "), "=", rtrim(vn, " "), "1"). compute v2=concat(rtrim(vn, " "), "=", rtrim(vn, " "), "2"). compute v3=concat(rtrim(vn1, " "), "=", vn). print / v1. execute. print / v2. execute.
do if vt="Nominal".
print / "if ", vn1, "", vn2, vn3, "=1.". else.
print / "if ", vn1, "", vn2, " or missing(", vn1, ")+missing(", vn2, ")=1 ", vn3, "=1.".
Scale Nominal Scale
end if. execute.
print / vn2, " ", vn3, " ", vn1. execute. print / vn1. execute. print / v3. execute.
---------------------------------------------------------------------
其中加粗部分表示由display variables指令生成的内容。需要注意的是,这部分与其前面的begin data及其后面的end data. 指令行之间都不能留下空行,否则运行此程序得到的输出会多出来一些内容,给编辑主程序及附加程序都带来不必要的麻烦。此外,加粗部分的指令行必须完全按照上面的步骤获取,除上面说的编辑过程外不再作任何增删,保证每行的开头没有空格,行中的空格(含有一个制表符)也不能增删,这样才能保证此程序正确地读取每个变量的名称与类型。
接下来将预程序拷到Syntax1中,覆盖原有指令,然后运行预程序,这样会生成一个临时数据文件,并在Output1中生成如下的输出结果:
=====================================================================
data list notable / vn 1-19 (a) vt 26-32 (a). begin data
Numeric_A Scale String_B Nominal Date_C Scale 数值型变量D Scale
字符型变量E Nominal 日期型变量F Scale end data.
string vn1 vn2 vn3 (a20).
compute vn1=concat(rtrim(vn, " "), "1"). compute vn2=concat(rtrim(vn, " "), "2"). compute vn3=concat(rtrim(vn, " "), "3"). string v1 v2 v3 (a40).
compute v1=concat(rtrim(vn, " "), "=", rtrim(vn, " "), "1"). compute v2=concat(rtrim(vn, " "), "=", rtrim(vn, " "), "2"). compute v3=concat(rtrim(vn1, " "), "=", vn). print / v1. execute.
Numeric_A=Numeric_A1 String_B=String_B1 Date_C=Date_C1
数值型变量D=数值型变量D1 字符型变量E=字符型变量E1 日期型变量F=日期型变量F1 print / v2. execute.
Numeric_A=Numeric_A2
String_B=String_B2
Date_C=Date_C2
数值型变量D=数值型变量D2
字符型变量E=字符型变量E2
日期型变量F=日期型变量F2
do if vt="Nominal".
print / "if ", vn1, "", vn2, vn3, "=1.".
else.
print / "if ", vn1, "", vn2, " or missing(", vn1, ")+missing(", vn2, ")=1 ", v
n3, "=1.".
end if.
execute.
if Numeric_A1 Numeric_A2 or missing(Numeric_A1
)+missing(Numeric_A2 )=1 Numeric_A3 =1.
if String_B1 String_B2 String_B3 =1.
if Date_C1 Date_C2 or missing(Date_C1
)+missing(Date_C2 )=1 Date_C3 =1.
if 数值型变量D1 数值型变量D2 or missing(数值型变量D1
)+missing(数值型变量D2 )=1 数值型变量D3 =1.
if 字符型变量E1 字符型变量E2 字符型变量E3 =1.
if 日期型变量F1 日期型变量F2 or missing(日期型变量F1
)+missing(日期型变量F2 )=1 日期型变量F3 =1.
print / vn2, " ", vn3, " ", vn1.
execute.
Numeric_A2 Numeric_A3 Numeric_A1
String_B2 String_B3 String_B1
Date_C2 Date_C3 Date_C1
数值型变量D2 数值型变量D3
字符型变量E2 字符型变量E3
日期型变量F2 日期型变量F3
print / vn1.
execute.
Numeric_A1
String_B1
Date_C1
数值型变量D1
字符型变量E1
日期型变量F1
print / v3.
execute.
Numeric_A1=Numeric_A 数值型变量D1 字符型变量E1 日期型变量F1
String_B1=String_B
Date_C1=Date_C
数值型变量D1=数值型变量D
字符型变量E1=字符型变量E
日期型变量F1=日期型变量F
---------------------------------------------------------------------
其中加粗的部分是将要用作下面主程序与附加程序的指令行。加粗并斜体的部分也是有用的指令行,但由于太长,SPSS 在
将其输出时把有的行断成了两行(这部分的指令行应该都是以if 起头的,否则就是因为被断开了)。可将指令行断开处的分行符删去,这时一个指令行在Word 中可能还是显示为两行,但因为没有断行的分行符,在后面作为SPSS 指令运行时会被当作一个指令行来处理。
此外,如果数据库的变量比较多,上面的指令运行后输出到输出文件中的结果会很长,SPSS 会对其进行分页。分页处有个
红色的小三角形及几个空行。结果拷到Word 后,这三角形与空行都应予以删除。
将上述结果加黑的部分保留下来,共有六部分指令行。对于我们所用的简单的数据文件来说,每部分共6行(每行对应于原
数据文件的一个变量),分别如下所示:
=====================================================================
Numeric_A=Numeric_A1
String_B=String_B1
Date_C=Date_C1
数值型变量D=数值型变量D1
字符型变量E=字符型变量E1
日期型变量F=日期型变量F1
Numeric_A=Numeric_A2
String_B=String_B2
Date_C=Date_C2
数值型变量D=数值型变量D2
字符型变量E=字符型变量E2
日期型变量F=日期型变量F2
if Numeric_A1 Numeric_A2 or missing(Numeric_A1)+missing(Numeric_A2 )=1 Numeric_A3 =1.
if String_B1 String_B2 String_B3 =1.
if Date_C1 Date_C2 or missing(Date_C1)+missing(Date_C2 )=1 Date_C3
=1.
if 数值型变量D1 数值型变量D2 or missing(
D3 =1.
if 字符型变量E1 字符型变量E2
if 日期型变量F1 日期型变量F2 or missing(
F3 =1.
Numeric_A2 Numeric_A3 Numeric_A1
String_B2 String_B3 String_B1
Date_C2 Date_C3 Date_C1 数值型变量D1)+missing(数值型变量D2 )=1 字符型变量E3 =1. 日期型变量F1)+missing(日期型变量F2 )=1 数值型变量日期型变量
数值型变量D2 数值型变量D3 数值型变量D1
字符型变量E2 字符型变量E3 字符型变量E1
日期型变量F2 日期型变量F3 日期型变量F1
Numeric_A1
String_B1
Date_C1
数值型变量D1
字符型变量E1
日期型变量F1
Numeric_A1=Numeric_A
String_B1=String_B
Date_C1=Date_C
数值型变量D1=数值型变量D
字符型变量E1=字符型变量E
日期型变量F1=日期型变量F
---------------------------------------------------------------------
此6部分指令行中,前4部分将用于主程序,后两部分则将用于附加程序。第三部分的输出中,第二行与第五行与其前后的
指令行相比要短,这是因为String_B1与“字符型变量E1”是字符型变量,而主程序中有些指令对字符型变量的处理方法与对其它类型变量的处理方法不完全一样,这两行指令较短是正常的。
至此,预程序运行生成的临时数据文件中有用的信息已被完全提取出来,此数据文件对下面的步骤已属无用,不必保存。
3. 主程序的生成及运行
截取从预程序运行获得的前4部分指令行,将其编辑成如下程序:
=====================================================================
get file='c:\Data1.sav'.
save outfile='c:\Data3.sav'
/rename
Numeric_A=Numeric_A1
String_B=String_B1
Date_C=Date_C1
数值型变量D=数值型变量D1
字符型变量E=字符型变量E1
日期型变量F=日期型变量F1.
execute.
get file='c:\Data3.sav'.
match files / file=*
/file='c:\Data2.sav'
/rename
Numeric_A=Numeric_A2
String_B=String_B2
Date_C=Date_C2
数值型变量D=数值型变量D2
字符型变量E=字符型变量E2
日期型变量F=日期型变量F2.
if Numeric_A1 Numeric_A2 or missing(Numeric_A1)+missing(Nu
=1.
if String_B1 String_B2 String_B3 =1.
if Date_C1 Date_C2 or missing(Date_C1)+missing(Date_C2 )=1 Date_C3 =1.
if 数值型变量D1 数值型变量D2 or missing(
D3 =1.
if 字符型变量E1 字符型变量E2
if 日期型变量F1 日期型变量F2 or missing(
F3 =1.
execute.
save outfile='c:\Data4.sav'
/keep
Numeric_A2 Numeric_A3 Numeric_A1
String_B2 String_B3 String_B1
Date_C2 Date_C3 Date_C1
数值型变量D2 数值型变量D3
字符型变量E2 字符型变量E3 meric_A2 )=1 Numeric_A3 数值型变量D1)+missing(数值型变量D2 )=1 字符型变量E3 =1. 日期型变量F1)+missing(日期型变量F2 )=1 数值型变量D1 字符型变量E1 数值型变量日期型变量
日期型变量F2 日期型变量F3 日期型变量F1
/map.
execute.
get file='c:\Data4.sav'. ---------------------------------------------------------------------
程序中的加粗部分均取自预程序运行获得的指令行,但要注意前两部分最后的“. ”是输出结果中所没有的,需要手工加上。 此程序的运行过程是先将Data1.sav 的变量都加上“1”的后缀,另存为Data3.sav (Data1.sav 的变量名称没发生改变),随后将Data3.sav 打开,将Data2.sav 中的变量加上“2”的后缀后并入Data3.sav ,接着将原Data3.sav 中的变量一一跟来自Data2.sav 的相应的变量进行对比,生成加有“3”的后缀的纠错变量。最后用SPSS 的MAP 功能将变量顺序重排,另存为数据文件Data4.sav ,并将Data4.sav 打开。
主程序运行完毕后,显示出来的Data4.sav 中的变量以3个一组的顺序排列,每一组第一个变量源于Data2.sav ,第二个为纠错变量,第三个源于Data1.sav 。纠错变量在Data1.sav 与Data2.sav 的数据相同时为缺失(在电脑上显示为句点),在二者不同时为1.00,这样便醒目地标出了Data1.sav 与Data2.sav 中数据不相同之处。这样的排列顺序及纠错变量的取值便于对照问卷进行查找。一定要注意,找出错误以后,要对来自Data1.sav 的数据(即带“1”的后缀的变量的数据)进行纠错,因为下面的附加程序运行后是将来自Data2.sav 的变量与纠错变量全部删除,而保留来自Data1.sav 的变量。在此步骤中,如果是Data1.sav 中的数据无误而Data2.sav 中的数据有误的话,则不必纠正。
4. 生成和运行附加程序
在对照问卷手工纠错完成后,将从预程序运行所获结果的最后两部分编成如下程序:
=====================================================================
save outfile='c:\Data3.sav'
/keep
Numeric_A1
String_B1
Date_C1
数值型变量D1
字符型变量E1
日期型变量F1
/rename
Numeric_A1=Numeric_A
String_B1=String_B
Date_C1=Date_C
数值型变量D1=数值型变量D
字符型变量E1=字符型变量E
日期型变量F1=日期型变量F .
execute. get file='c:\Data3.sav'.
其中加黑部分是从预程序运行结果中截取来的,但第二部分最后的“. ”须手工加上。
附加程序运行后,将校正过的变量另存为Data3.sav (原Data3.sav 将被覆盖),其结构与Data1.sav 与Data2.sav 完全一致。当然,用户也完全可以为最后的数据文件选择其他名称,这只需修改程序的最后一行指令即可。
5. 使用中应注意的问题
在使用上述程序前,先对两个数据文件按个案编号进行排序,并用上面介绍的手动操作对个案编号这一变量进行检验,以保证两个数据文件中录入的数据没有遗漏个案、重复录入同一个案、个案排序不同等错误,因为这样的错误可能会使计算机在自动
比较数据时将不同的个案进行比较,从而严重影响比较的结果。
程序中的说明、指令等均为针对SPSS for Windows的15.0版本编写的,其它版本在使用时有可能需要作一些微调。
对于变量很多的数据文件,绝大多数指令行都是加黑字体标出的部分,亦即由SPSS 自动生成。此外的部分则可以一次编好后存为一个Syntax 文件或拷贝到一个Word 文档中保存起来,以备在以后的调查中重复使用。
以上的程序旨在给出一个基本的思路。有了这些程序作为框架,用户可以进行很多灵活的应用。例如,如果担心一次手工纠错后还会遗留下一些错误,可以将主程序运行生成的Data4.sav 拷贝一份,由两个人分别纠错,纠错后分别运行附加程序,生成两份与原数据文件结构一致的文件,将其更名为Data1.sav 与Data2.sav ,再按照编好的主程序运行一遍,进行第二轮纠错。
六、采用并行录入,对比纠错后剩余误差的分析
用上述方法纠错以后,剩余的误差由两部分组成:一部分是没有纠出的错误。即对于一个数据,两个录入员都录入错了,而且错成了一样。如果考虑到非法的错误数据可以通过频数分布找出的话,这样的剩余错误只存在于数据的合法取值范围之内。假设录入误差率为p ,某个变量的取值范围内包含了n 个数,则上述剩余误差的概率是两个随机事件之积的概率。即在第一个人录入了某个错误数据的情况下又发生了第二个人录入了同样的错误数据的概率。这个概率为:p 2
n 1。从公式中可以看出:变量的
取值范围内包含的数值越多,第一部分的剩余误差率就越低。第二部分剩余误差是修改过程中的错误录入。即发现了错误后没有改正过来,或是改了以后又改错了。这部分剩余误差的概率是录入误差概率的两次累积。实际上是第一次录入错误的条件下又发生了第二次修改错误。这个条件概率为p 2。如果只进行一次对比纠错,剩余的总误差为第一部分的剩余误差与第二部分剩余误差的和,用公式表示为:
1⎫2⎛p +1⎪ (1)
⎝n -1⎭
从这个公式中可以看出,对于剩余的总误差来说,如果变量的取值范围很大,在该范围内包含的变量值个数足够多,即n 足够大。公式中的1
n -1+1趋近于1。则总的剩余误差率为p 。即总的剩余误差就是第二部分的剩余误差。如果n 为2,即变量是二分名2
义变量,只有两个取值,则总的剩余误差为2p 2。所以,从理论上看,一次纠错后的剩余误差率介于p 2与2p 2之间。如录入误差p 按1/100计,此剩余错误率介于,1/10000与2/10000之间。
从公式中也可以看出,一般情况下,在总的剩余误差中第二部分所占的比重较大。如果希望消除这部分剩余误差,可以由两个人分别将两份数据文件中的错误修改以后,再重复一次上述的对比纠错过程。这样,第二部分剩余误差的概率将变为p 4。总的剩余误差率为
p 2
n -1+p (2)
44在这个公式中,第二部分剩余误差率p 是一个相当小的数。如p 仍以1/100计算的话。第二部分剩余误差的概率将变为
1/100000000。这样的小概率事件在一次调查中基本上是不会发生的。用这样的方法可以将修改过程中的错误录入基本上全部消除。这样纠错后的剩余误差就只剩下第一部分的剩余误差了。也就是说,在总的剩余误差率中,由于第二部分的剩余误差率p 4已经相当小,可以忽略不计,因而第一部分的剩余误差即为总的剩余误差。也就是式(2)中的前一部分p 2
n -1。下面仍以包含100
个变量的1000份问卷为例来看一下剩余误差的情况:假设平均每个变量有5个取值,人的录入误差p 仍按1/100计算。则按照
一次对比纠错的公式计算出的剩余误差率为1.25/10000。估算出的错误数据个数平均为12.5个。按照两次对比纠错后的公式计算出的剩余误差率为 2.5/100000,剩余错误数据个数平均为2.5个。这样的精确度对于社会学研究显然是足够了。
七、彻底消除录入误差的方法
尽管使用上述方法纠错后,录入误差已基本消除。但如果二分名义变量较多,而且录入数据的量达到百万以上的话,还会有个别的错误数据存在。如果用户希望进一步消除录入误差,可以采用三人并行录入,两两对比纠错的方法。这样做的结果使得剩余误差率为:p 3
2(n -1)。这是三个人都录入错误,而且错成一样的概率。仍按上例的条件来计算,三人录入,两两对比纠错后的
剩余误差率为1/16000000。也就是说当数据录入量达到一千六百万个时才有可能出现一个错误数据。如果数据录入量达不到上千万,就能基本保证没有错误。同样道理,如果希望精度再提高,可以由四人录入,然后两两对比纠错。如果仍按上例的条件来计算,这样做的结果将使剩余误差率降为1/6400000000。即平均录入六十四亿个数据才会出现1个错误数据。但这样做虽然能确保精度,却提高了录入成本。尤其在数据量非常大的情况下,这样做的结果是很不经济的。