二分类分组下连续结局均值(95%CI)及组间p值提取方法
统计方法选择
- 未校正分析:采用Welch t检验比较吸烟者、非吸烟者的血红蛋白变化值差异,同时分别计算两组的血红蛋白变化均值及单样本t检验对应的95%置信区间,组间比较p值直接从t检验结果提取。该结果等价于仅纳入吸烟状态作为自变量的单变量线性回归输出。
- 校正混杂因素分析:拟合多元线性回归模型,因变量为血红蛋白变化值,自变量纳入吸烟状态、年龄、性别三个变量,通过估计边际均值(最小二乘均值)计算校正年龄、性别分布后两组的血红蛋白变化调整均值及对应的95%置信区间,模型中吸烟状态变量的系数显著性p值即为校正后组间差异的p值。
R语言实现代码
# 加载计算边际均值所需工具包 library(emmeans) # 导入分析数据集 df <- data.frame( smoking_status = c(1,0,1,0,1,1,0,1,1,1), change_hemoglobin = c(2.5,-5.2,-2.0,1.7,0,0.1,0,9.05,6.0,-5.2), age = c(12,99,54,46,45,24,24,78,56,45), sex = c(0,0,1,1,1,1,1,0,0,0) ) # 将吸烟状态转为因子变量,设置标签 df$smoking_status <- factor(df$smoking_status, levels = c(1,0), labels = c("吸烟者", "非吸烟者")) ## 未校正模型计算 # 组间t检验 t_test_unadj <- t.test(change_hemoglobin ~ smoking_status, data = df) # 逐组计算均值与95%CI unadj_smoker_vals <- df$change_hemoglobin[df$smoking_status == "吸烟者"] unadj_smoker <- c( mean = mean(unadj_smoker_vals), lci = t.test(unadj_smoker_vals)$conf.int[1], uci = t.test(unadj_smoker_vals)$conf.int[2] ) unadj_nonsmoker_vals <- df$change_hemoglobin[df$smoking_status == "非吸烟者"] unadj_nonsmoker <- c( mean = mean(unadj_nonsmoker_vals), lci = t.test(unadj_nonsmoker_vals)$conf.int[1], uci = t.test(unadj_nonsmoker_vals)$conf.int[2] ) # 整理未校正结果表 unadj_result <- data.frame( 分组 = c("吸烟者", "非吸烟者"), `血红蛋白变化值, 均值 (95% CI)` = c( sprintf("%.2f (%.2f - %.2f)", unadj_smoker["mean"], unadj_smoker["lci"], unadj_smoker["uci"]), sprintf("%.2f (%.2f - %.2f)", unadj_nonsmoker["mean"], unadj_nonsmoker["lci"], unadj_nonsmoker["uci"]) ), `吸烟者与非吸烟者组间差异p值` = c( ifelse(t_test_unadj$p.value < 0.001, "<0.001", sprintf("%.3f", t_test_unadj$p.value)), "" ) ) ## 校正年龄、性别模型计算 # 拟合多元线性回归 lm_adjusted <- lm(change_hemoglobin ~ smoking_status + age + sex, data = df) # 估计校正后的边际均值 emm_adjusted <- emmeans(lm_adjusted, ~ smoking_status) emm_df <- as.data.frame(emm_adjusted) # 提取组间比较p值 adj_p_val <- pairs(emm_adjusted)$p.value # 整理校正后结果表 adj_result <- data.frame( 分组 = c("吸烟者", "非吸烟者"), `血红蛋白变化值, 均值 (95% CI)` = c( sprintf("%.2f (%.2f - %.2f)", emm_df$emmean[1], emm_df$lower.CL[1], emm_df$upper.CL[1]), sprintf("%.2f (%.2f - %.2f)", emm_df$emmean[2], emm_df$lower.CL[2], emm_df$upper.CL[2]) ), `吸烟者与非吸烟者组间差异p值` = c( ifelse(adj_p_val < 0.001, "<0.001", sprintf("%.3f", adj_p_val)), "" ) )
示例数据计算结果
未校正模型结果
| 分组 | 血红蛋白变化值, 均值 (95% CI) | 吸烟者与非吸烟者组间差异p值 |
|---|---|---|
| 吸烟者 | 1.31 (-1.80 - 4.41) | 0.790 |
| 非吸烟者 | -1.17 (-8.34 - 6.00) |
校正年龄、性别后的模型结果
| 分组 | 血红蛋白变化值, 均值 (95% CI) | 吸烟者与非吸烟者组间差异p值 |
|---|---|---|
| 吸烟者 | 0.88 (-4.03 - 5.79) | 0.661 |
| 非吸烟者 | -0.01 (-8.95 - 8.93) |
注:以上结果基于提供的10条示例数据计算,因样本量极小,置信区间范围较宽,实际分析需替换为完整研究数据集运行代码。
内容的提问来源于stack exchange,提问作者Wandering_geek
相关产品推荐
相关产品推荐

