R和SPSS线性模型结果的差异

4
我是一名统计学初学者,目前正在参加一门使用的入门课程。同时我也在尝试学习,到目前为止,我使用这两个工具进行计算得到了相同的结果,这是意料之中的。
然而,我们现在正在进行相关性(Pearson's Rho)和拟合线性模型的操作,但是我在RSPSS之间得到的结果始终不同。
数据集是this zip-file中的GSS2012.zip
d = GSS2012$tolerance
e = GSS2012$age
f = GSS2012$polviews
g = GSS2012$educ

SPSS    R   std. error (SPSS)  
intercept   6,694   7,29707726  0,623  
e   -0,031  -0,03130627 0,006  
f   -0,123  -0,20586503 0,072  
g   0,411   0,40029541  0,033  

下面是完整的、最小的工作示例,可以获得上述结果。
我尝试了不同的 use="stuff" 用于 cor;并没有什么区别。
cor(d, e, use = "pairwise.complete.obs")

lm的完整、最小工作示例:

> library(haven)
> GSS2012 <- read_sav("full version/GSS2012.sav")
> lm(GSS2012$tolerance ~ GSS2012$age + GSS2012$polviews + GSS2012$educ, na.action="na.exclude", singular.ok = F)

Call:
lm(formula = GSS2012$tolerance ~ GSS2012$age + GSS2012$polviews + 
    GSS2012$educ, na.action = "na.exclude", singular.ok = F)

Coefficients:
     (Intercept)       GSS2012$age  GSS2012$polviews      GSS2012$educ  
         7.29708          -0.03131          -0.20587           0.40030  

到目前为止,没有任何工具能像 SPSS 一样给我相同的价值。---并不是说我知道后者一定是正确的,我只是想复制结果。

SPSS 脚本:

DATASET ACTIVATE DataSet1. 
REGRESSION 
  /MISSING LISTWISE 
  /STATISTICS COEFF OUTS R ANOVA 
  /CRITERIA=PIN(.05) POUT(.10) 
  /NOORIGIN 
  /DEPENDENT tolerance 
  /METHOD=ENTER age polviews educ.

类似的文章可能会与此相关: link1; link2; link3, 但我无法使用其中的信息来复制SPSS数据。(再次提醒,R可能会有更准确的结果;我不确定。但是我现在处于"SPSS环境"中,因此如果能够获得相同的结果就最好了 :)


"f"和"g"是因子变量;你怎么能为它们得到单个系数?"e"也有"89+"类别。请展示你用来得到这些结果的完整代码。SPSS同理。 - Julius Vainora
感谢您抽出时间进行评论,@JuliusVainora。我已经添加了获取R和SPSS结果的完整代码。 - krissen
1个回答

3
这只是一个部分回答,我可以看到问题所在,但不确定其原因。问题与SPSS文件中缺失值的处理有关。以educ变量为例...
在SPSS文件中,您可以看到值为979899被定义为缺失值。

enter image description here

如果您按照educ列对SPSS文件进行排序,您会发现有2个数据行存在缺失值。它们的ID是8371214

enter image description here

在R中,您可以确认这些行确实包含缺失值(NA):
> which(is.na(GSS2012$educ))
[1]  837 1214

问题出在SPSS上,当你要求它计算有多少行数据缺失时,它只会显示有1行数据缺失。
FREQUENCIES VARIABLES=educ 
  /FORMAT=NOTABLE
  /ORDER= ANALYSIS .

enter image description here

问题出在ID 1214上。SPSS没有将1214的99值视为缺失值。例如,尝试更改837的educ为任何其他(非缺失)数字,您会发现SPSS表示educ有0个缺失行,但实际上1214仍然应该是缺失的(99)。
我没有检查,但我猜测类似的事情也发生在polviews变量的许多行中。
这样做的后果是,当您运行分析时,SPSS不会将这些行视为缺失数据,但在R中,这些值已正确设置为缺失并被省略。换句话说,SPSS使用了比应该使用的更多的模型数据。您可以通过查看SPSS和R输出来确认此操作-两个程序之间的自由度不同,这导致结果略有不同。

我不确定为什么SPSS没有将那些行视为缺失值。这可能是一个bug(SPSS并非第一次出现这种情况...)或者与文件设置有关。我没有检查后者,因为这是一个大文件,而且我对数据集不够熟悉,不知道该在哪里查看。


哦!非常有趣。这也可以解释为什么变量之间的差异会有所不同!谢谢! - krissen
权重似乎也参与其中;请参阅此reddit评论 - krissen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接