使用epiR::epi.conf()(ctype="inc.risk")计算累积发病率时结果与手动计算不一致的问题
epiR::epi.conf()(ctype="inc.risk")计算累积发病率时结果与手动计算不一致的问题
这个问题的核心是函数错误地计算了事件数/非事件数(优势比的逻辑),而非你预期的事件数/总人数(累积发病率),下面是具体的原因分析和解决方案:
一、问题根源分析
你得到的结果0.1382979正好等于13/94,这完全不是累积发病率的计算逻辑。出现这种情况的可能原因有两个:
矩阵构造或参数的隐性错误
你的输出和ctype="odds"(计算优势比)的结果完全一致,这说明要么你在代码中误将ctype写成了"odds",要么矩阵的维度/顺序被错误解析了——比如不小心把矩阵建为2行1列而非1行2列,旧版本epiR会把这种格式的矩阵错误地用「事件数/第二行的非事件数」来计算。epiR版本过旧
非常早期的epiR版本对ctype="inc.risk"的输入格式处理存在bug,导致计算逻辑偏离了累积发病率的定义。
二、解决方案
1. 确保矩阵输入格式完全正确
对于ctype="inc.risk",函数要求的是1行2列的矩阵,第一列是事件数,第二列是非事件数,这样函数才会用「事件数/(事件数+非事件数)」计算累积发病率:
events <- 13 non_events <- 94 # 正确构造矩阵:1行2列,顺序为[事件数, 非事件数] mat <- matrix(c(events, non_events), nrow = 1, ncol = 2, byrow = TRUE)
2. 确认参数无误并运行
确保ctype参数明确设置为"inc.risk",然后重新运行:
library(epiR) res <- epi.conf(mat, ctype = "inc.risk", method = "exact") res
此时正确的输出应该是:
est lower upper 1 0.1214953 0.06534318 0.2063471
其中est值和你手动计算的13/107≈0.1215完全一致。
3. 更新epiR到最新版本
如果你的epiR版本较旧,建议立即更新到最新稳定版,彻底避免旧版本的格式解析bug:
install.packages("epiR") library(epiR)
三、快速验证方法
- 运行
epi.conf(mat, ctype="odds", method="exact"),如果输出和你之前的错误结果一致,说明你之前大概率误写了ctype参数; - 用
dim(mat)检查矩阵维度,确保输出是[1, 2](1行2列)。
备注:内容来源于stack exchange,提问作者Agustín Nava
相关产品推荐
相关产品推荐

