在R中解读逻辑回归输出:获取分类变量的优势比
分类预测变量的单变量逻辑回归问题
背景
我想用分类预测变量运行一系列单变量逻辑回归,但统计学基础已生疏,遇到了困惑。之前查过类似问题,但没找到能直接套用到我这个示例的清晰答案,而且不同函数算出的估计值还存在差异。
示例数据集
# 创建示例数据框 df <- structure(list( 'sick'=c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1), 'agecat'=c(23,1,2,2,2,2,2,2,3,3,3,3,1,4,4,1,3,1,2,4), 'gender'=c(1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0))) # 转换为因子变量 df$agecat <- factor(df$agecat, levels=c(1,2,3,4), labels=c("0-19","20-39","40-59","60-79")) df$gender <- factor(df$gender, levels=c(0,1), labels=c("male","female"))
单变量逻辑回归代码
# 确定预测变量列 predictors <- c('agecat', 'gender') cols <- df[predictors] # 用lapply生成未调整的逻辑回归结果列表 A <- lapply(as.list(cols), function(x) glm(sick ~ x, data=df, family=binomial(link="logit"))) A
我已经通过单独为gender和agecat构建模型并对比,确认这段代码有效,比如:
m <- glm(sick ~ gender, data=df, family=binomial(link="logit")) m
我知道A中的估计值是对数优势比,需要取指数得到优势比,对应的代码是:
# 把列表转换为tibble并取指数 do.call(rbind, lapply(A, broom::tidy, exponentiate=TRUE, conf.int=TRUE)) -> B B
这段代码没问题,因为B中的估计值和单独对模型运行exp(coef(m))得到的结果一致。
核心问题及解答
1. 如何解读B中的估计值?我认为它们是优势比,这个判断对吗?如果是,为什么截距/参考组的估计值不是1.00?
- 判断正确:非截距项的估计值是优势比,但截距项取指数后不是1.00,因为它代表的是所有预测变量都取参考水平时,患病的优势(即
P(sick=1)/P(sick=0)),而非组间的优势比。比如在性别模型中,截距对应男性(参考组)的患病优势,不是男性与自身的优势比(那才是1)。
2. 如果B中的结果是正确的优势比,展示结果时要不要包含截距?
- 通常不需要展示截距。我们做单变量逻辑回归关注的是不同类别相对于参考组的优势比,也就是非截距项的结果;截距只是参考组自身的患病概率转换后的优势值,不是组间对比的指标,所以无需展示。截距不是1的情况完全正常,不用困惑。
3. 用epitools::oddsratio算出的优势比和B中的结果有差异,但questionr::odds.ratio和B一致,是我用错了epitools函数吗?
epitools::oddsratio(x=df$gender, y=df$sick) # 算出女性的OR是0.47,而预期是0.44 questionr::odds.ratio(m) # 算出女性的OR是0.44,和B一致
- 问题出在
epitools::oddsratio的参数逻辑和默认设置:- 该函数默认以
x为行、y为列构建列联表,计算的是行变量不同水平相对于第一行的优势比,而你的逻辑回归是把gender作为自变量、sick作为因变量,两者的变量角色对应关系不一致。 - 另外,
epitools默认用条件最大似然估计,而glm用的是无条件最大似然估计,这也会导致数值差异。
- 该函数默认以
- 调整参数可让
epitools结果与glm一致:
# 调整列联表顺序,并用无条件ML估计 epitools::oddsratio(table(df$sick, df$gender), method="wald")
内容的提问来源于stack exchange,提问作者Lindsay
相关产品推荐
相关产品推荐

