基于boot包downs.bc数据集的事件概率、OR与OD模型计算咨询
问题解答
一、现有计算方式的可行性
你用glm(cbind(r, m-r) ~ age, family = binomial, data = boot::downs.bc)拟合模型的做法完全正确——这种列联表形式(cbind(r, m-r))是处理分组二项数据的标准操作,模型输出的系数也没问题。但要注意:你计算出来的-6.43632和-5.06053是对数优势(log-odds),不是事件发生的概率,必须经过转换才能得到概率。
二、计算20岁、30岁人群的事件概率
有两种常用方法:
方法1:用predict函数直接预测
这是最简便且不易出错的方式,直接指定type = "response"就能得到概率:
# 先拟合模型(和你的代码一致) mod1 <- glm(cbind(r, m-r) ~ age, family = binomial, data = boot::downs.bc) # 构造包含目标年龄的新数据集 new_ages <- data.frame(age = c(20, 30)) # 预测概率 predicted_probs <- predict(mod1, newdata = new_ages, type = "response") predicted_probs
方法2:手动转换对数优势
用sigmoid函数把你算出的log-odds转换成概率,公式为:概率 = exp(对数优势) / (1 + exp(对数优势))
# 20岁人群的概率 log_odds_20 <- -10.563690 + 20 * 0.137579 prob_20 <- exp(log_odds_20) / (1 + exp(log_odds_20)) # 30岁人群的概率 log_odds_30 <- -10.563690 + 30 * 0.137579 prob_30 <- exp(log_odds_30) / (1 + exp(log_odds_30)) prob_20 prob_30
两种方法得到的结果完全一致。
三、计算Odds Ratio(优势比)并构建模型
你提到的“OD模型”应该是指基于优势比的logistic回归模型——你已经拟合了正确的模型,下面是具体的OR计算方法:
1. 构建模型
你拟合的mod1就是标准的logistic回归模型,它的核心就是用优势比来量化自变量对事件发生概率的影响:模型中age的系数表示年龄每增加1岁,事件发生的对数优势的变化量。
2. 计算优势比
优势比是系数的指数形式,直接对模型系数取指数即可得到:
# 计算年龄的优势比 age_or <- exp(coef(mod1)[["age"]]) age_or # 计算优势比的95%置信区间(更严谨的做法) age_or_ci <- exp(confint(mod1)[["age"], ]) age_or_ci
这里得到的OR≈1.147,意思是:年龄每增加1岁,事件发生的优势(发生概率/不发生概率)是原来的1.147倍。
内容的提问来源于stack exchange,提问作者fashionable
相关产品推荐
相关产品推荐

