我是一名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