我是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)。我错过了什么吗?我知道这似乎是一个基本问题,但我找不到我的错误。
答案 0 :(得分:1)
使你的指示组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
答案 1 :(得分:1)
(您的数字错误:基于排名的赔率是(87/125)/(40/148)= 2.5752,以及 log-odds ,这是逻辑回归系数,为0.946。)
默认情况下,R选择因子的第一级作为参考级别。然而,SAS选择最后一级。有一个contr.SAS
功能专门用于复制SAS结果。你也可以使用relevel
作为@thelatemail说的。
> 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