在SAS和R中复制probit回归

时间:2010-08-02 20:52:28

标签: r sas

我正在尝试在R中复制我的SAS工作,但我得到的结果略有不同 - 差异无法通过舍入错误来解释。

这是我的SAS代码:

proc qlim data=mydata;
   model y = x1 x2 x3/ discrete(d=probit);
   output out=outdata marginal;
   title "just ran QLIM model";
run;
quit;

这是我的R代码:

mymodel <- glm(y ~ x1 + x2 + x3, family=binomial(link="probit"), data=mydata)

我不确定为什么会得到不同的结果,并且非常感谢您的解释。

EDIT 这是我的数据:

2.66  20  0  0
2.89  22  0  0
3.28  24  0  0
2.92  12  0  0
4.00  21  0  1
2.86  17  0  0
2.76  17  0  0
2.87  21  0  0
3.03  25  0  0
3.92  29  0  1
2.63  20  0  0
3.32  23  0  0
3.57  23  0  0
3.26  25  0  1
3.53  26  0  0
2.74  19  0  0
2.75  25  0  0
2.83  19  0  0
3.12  23  1  0
3.16  25  1  1
2.06  22  1  0
3.62  28  1  1
2.89  14  1  0
3.51  26  1  0
3.54  24  1  1
2.83  27  1  1
3.39  17  1  1
2.67  24  1  0
3.65  21  1  1
4.00  23  1  1
3.1   21  1  0
2.39  19  1  1

这是我的估计系数(parant中的std错误):

SAS: -7.452320 (2.542536)
      1.625810 (0.693869)
      0.051729 (0.083891)
      1.426332 (0.595036)
R:   -7.25319  (2.50977)
      1.64888  (0.69427)
      0.03989  (0.07961)
      1.42490  (0.58347)

5 个答案:

答案 0 :(得分:3)

可能在默认情况下使用的对比度矩阵中。 R使用治疗对比,而SAS使用它自己。在帮助中查找对比和contr.SAS。如果你正在使用SAS对比很多,你可能只想设置选项。

options(contrasts=c("contr.SAS", "contr.poly"))

要了解这会如​​何影响事物,请观察治疗和SAS对比度矩阵的差异

contr.treatment(4)
  2 3 4
1 0 0 0
2 1 0 0
3 0 1 0
4 0 0 1

contr.SAS(4)
  1 2 3
1 1 0 0
2 0 1 0
3 0 0 1
4 0 0 0

答案 1 :(得分:1)

当我使用您的数据和代码在R中运行它时,我得到了您为SAS结果显示的答案(接近):

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept) -7.45231    2.57152  -2.898  0.00376 **
x1           1.62581    0.68973   2.357  0.01841 * 
x2           0.05173    0.08119   0.637  0.52406   
x3           1.42633    0.58695   2.430  0.01510 * 

标准错误减少了几个百分点,但这并不令人惊讶。

我也在glmmADMB(可用于R-forge)中运行它,这是一个完全不同的实现,并且估计距离稍微远一点,但标准误差更接近于SAS - 比您最初的差异小得多无论如何报道。

library(glmmADMB)
> mm2 <- glmmadmb(y~x1+x2+x3,family="binomial",link="probit",data=mydata)
["estimated covariance may be non-positive-definite warnings"]
> summary(mm2)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  -7.4519     2.5424   -2.93   0.0034 **
x1            1.6258     0.6939    2.34   0.0191 * 
x2            0.0517     0.0839    0.62   0.5375   
x3            1.4263     0.5950    2.40   0.0165 * 

您使用的是什么版本的R? (它可能可能版本之间发生了某些变化,虽然glm是非常稳定的代码......)你确定你没有弄乱一些东西吗?

> sessionInfo()
R Under development (unstable) (2011-10-06 r57181)
Platform: i686-pc-linux-gnu (32-bit)

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] glmmADMB_0.6.4 

答案 2 :(得分:0)

我是R新手,但我有一个建议。

尝试使用另一个R包运行probit ...尝试Zelig。

mymodel <- zelig(y ~ x1 + x2 + x3, model="probit", data=mydata)
summary(mymodel)

此模型中的回归系数是否不同?

答案 3 :(得分:0)

这是一个很好的来源http://sas-and-r.blogspot.com/

答案 4 :(得分:0)

您应该比较报告最高对数可能性的软件。这些数字可能不同,因为终止标准在两种算法中都不同。例如,大多数算法使用梯度范数作为停止规则(即:小于0.0005时),但每个软件都使用自己的规范。 取决于它停止的位置,这些估计的方差将明显不同,因为它们是通过反转Hessian(在它停止的地方进行评估)获得的。 为了100%确定,您可以使用报告最高对数似然性的R或SAS值进行检查。或者您可以使用这些值手动计算对数似然。 如果有人要求您在R和SAS中报告完全相同的值,只需触摸两种算法的收敛标准即可。在两种情况下都设置一些非常严格的参数&lt; 0.00000005,两个程序都应报告相同的值。

(除非你的可能性有多个最大值,这似乎不是这里的问题;在这种情况下,最终的估计将取决于你的初始值)