SPSS – 字符串变量的缺失值处理
作者:Ruben Geert van den Berg,发表于 SPSS 博客
- 设置字符串变量的缺失值
- 缺失字符串值与 MEANS 命令
- 缺失字符串值与 CROSSTABS 命令
- 缺失字符串值与 COMPUTE 命令
- 缺陷的解决方法
在 SPSS 中可以为字符串变量设置缺失值吗? 简短的回答:可以。 但遗憾的是,它并没有按预期工作。 本教程将引导您了解一些问题和解决方法。
示例数据
本教程中的所有示例都使用 staff.sav 数据文件,部分内容如下所示。 我们将并行对“Job Type (职位类型)”(字符串变量)和“Marital Status (婚姻状况)”(数值变量)执行一些基本操作。
首先,让我们通过运行以下 语法 为两个变量创建基本频数分布。
***数值变量和字符串变量的最小频率表。
**
frequencies marit jtype.
结果
让我们快速看一下下面显示的字符串变量的频率分布。
默认情况下,字符串变量 中的所有值都是有效的(非缺失),包括零个字符的空字符串值。
设置字符串变量的缺失值
现在,假设我们想将空字符串值和“(Unknown)”设置为 用户缺失值。 经验丰富的 SPSS 用户可能会认为运行 missing values jtype ('','(Unknown)').
应该可以解决问题。 遗憾的是,SPSS 只是给出了一个令人困惑的警告:
> Warning # 4812 in column 26. Text: (Unknown)
> The missing value is specified more than once.
首先,此警告毫无意义:我们没有多次指定任何缺失值。 即使我们这样做了,那又如何?
其次,该警告没有告诉我们_真正_的问题。 如果我们运行 missing values jtype ('(Unknown)').
,我们会发现问题。 这会触发以下警告,告诉我们用户缺失的字符串值太长。
> Error # 4809 in column 23. Text: (Unknown)
> The missing value exceeds 8 bytes.
> Execution of this command stops.
解决此问题的一个快速方法是简单地将 ‘(Unknown)’ RECODE 为更短的字符串,例如 ‘NA’(“Not Available”的缩写)。 以下语法就是这样做的。 然后,它为“Job Type (职位类型)”设置用户缺失值并重新运行频率表。
***将 (Unknown) 转换为更短的字符串值。
**
recode jtype ('(Unknown)' = 'NA').
***为字符串变量设置 2 个用户缺失值。
**
missing values jtype ('','NA').
***快速检查。
**
frequencies marit jtype.
结果
此时,一切似乎都很好:空字符串值和“NA”都列在频率表中的缺失值部分中。
缺失字符串值与 MEANS 命令
运行基本 MEANS 表时,用户缺失的字符串值被视为有效值。 以下语法演示了该问题:
***按数值变量和字符串变量的基本 MEANS 命令。
**
means salary by marit jtype
/statistics anova.
结果
请注意,用户缺失值在第一个 means 表中被排除,但在第二个 means 表中被包括。 由于这没有意义且没有记录,因此我强烈怀疑这是 SPSS 中的一个 bug。
现在让我们尝试一些 CROSSTABS。
缺失字符串值与 CROSSTABS 命令
我们现在从以下语法中运行两个基本列联表。
***按数值变量和字符串变量的基本 CROSSTABS。
**
crosstabs marit jtype by sex.
结果
基本结论:两个表都完全排除了字符串变量和数值变量的用户缺失值。 这表明上述问题仅限于 MEANS 命令。 但不幸的是,还有更多麻烦…
缺失字符串值与 COMPUTE 命令
二分化 变量的一个好方法是使用单行 COMPUTE 命令,例如 compute marr = (marit = 2).
在此语法中,(marit = 2)
是一个条件,对于某些情况可能为假,而对于另一些情况可能为真。 SPSS 返回 0 和 1 来表示假和真,因此创建了一个不错的 虚拟变量。
现在,如果 marit 是(系统或用户)缺失值,SPSS 不知道条件是否为真,因此在新变量上返回系统缺失值。 遗憾的是,这不适用于字符串变量,如下所示。
***二分化数值变量(正确结果)。
**
compute marr = (marit = 2).
variable labels marr 'Currently married (yes/no)'.
frequencies marr.
***二分化字符串变量(错误结果)。
**
compute it = (jtype = 'IT').
variable labels it 'Job type IT (yes/no)'.
frequencies it.
解决此问题的一种方法是使用 IF 命令。 这本不应该必要的,但它确实可以规避这个问题。
***在正确重新计算它之前删除“it”。
**
delete variables it.
***二分化字符串变量(正确结果)。
**
if(not missing(jtype)) it = (jtype = 'IT').
variable labels it 'Job type IT (yes/no)'.
frequencies it.
结果
缺陷的解决方法
本教程中讨论的问题很严重; 它们可能会产生容易被忽视的错误结果。 处理它们的几种方法如下:
- 使用 AUTORECODE 命令将字符串变量自动重编码为数值变量,然后继续使用这些数值对应项。
- 对于创建表和/或图表,使用 FILTER 排除具有字符串缺失值的情况,甚至使用 SELECT IF 完全删除它们。
- 对于创建新变量,IF 和 DO IF 命令应该足以应对大多数情况。
好吧,我想关于用户缺失字符串值的内容应该足够了。 我希望您觉得我的教程有帮助。 如果您有任何问题或意见,请在下面给我们留言。
感谢您的阅读!