为什么R和SAS的对数二项回归结果不同

  • 本文关键字:二项 回归 结果 SAS r sas glm
  • 更新时间 :
  • 英文 :


我是一名R新手,我一直在玩数据集来学习R。我的大部分经验都在SAS。因此,在试图对二分结果和暴露变量进行对数二项回归时,我立即注意到R产生的结果与我进行的偶然性分析不一致,即从SAS结果中产生粗略的相对风险估计。

该数据集有400个观测值。结果是被大学录取(1=是,0=否),自变量是高中班级排名(1=高,0=低)。

我创建了一个2x2表格:

      Admission     Row Total
Rank   1      0
   1  87    125     212
   0  40    148     188

在这里可以看出,高排名会使被大学录取的概率增加1.9倍[(87/212)/(40/188)]。粗略的估计会产生大约0.65(ln 1.9)的贝塔系数。然而,当我在R中进行对数二项回归时,它产生的贝塔系数是0.289。

这是我的代码:

glm(formula = admit ~ rank, family = binomial(link = log), data = my data)

我知道,在R中,我必须将数值变量转换为"因子",并对它们进行排序。两个变量的引用组均为0。

在SAS中,我使用的代码是:

proc genmod data=temp; model admit=rank/link=log dist=binomial;
estimate 'Prob of admission by rank' rank 1/exp;
run;  

等级的贝塔系数是0.657(RR=1.93)。我是不是遗漏了什么?我知道这似乎是一个基本问题,但我找不到我的错误。

将引用组设为1而不是0似乎可以修复

# change the reference level:
x$rank <-  relevel(factor(x$rank),"1")
x$admit <- relevel(factor(x$admit),"1")
fit <- glm(admit ~ rank, data=x, family=binomial(link="log"))
coef(fit)
#(Intercept)       rank0 
# -1.5475625   0.6568844 
exp(coef(fit))
#(Intercept)       rank0 
#   0.212766    1.928774 

这是否是一件"好事"有点值得怀疑-点击此处阅读更多:

http://r.789695.n4.nabble.com/Relative-Risk-in-logistic-regression-td4657040.html

(您的数字是错误的:根据排名录取的赔率为(87/125)/(40/148)=2.5752,逻辑回归系数对数赔率为0.946。)

默认情况下,R选择因子的第一个级别作为参考级别。然而,SAS选择了最后一个级别。有一个contr.SAS函数,专门用于更容易地复制SAS结果。您也可以像@thelatemail所说的那样使用relevel

> df <- data.frame(rank=factor(0:1), admit=c(40, 87), nonadmit=c(148, 125))
> contrasts(df$rank) <- contr.SAS(2)
> glm(cbind(admit, nonadmit) ~ rank, family=binomial, data=df)
Call:  glm(formula = cbind(admit, nonadmit) ~ rank, family = binomial, 
    data = df)
Coefficients:
(Intercept)        rank1  
    -0.3624      -0.9459  
Degrees of Freedom: 1 Total (i.e. Null);  0 Residual
Null Deviance:      18.31 
Residual Deviance: 2.043e-14    AIC: 15.07

最新更新