如何避免R语言sjPlot包的plot_model()函数进行数值外推
问题原因
sjPlot包的plot_model()函数默认基于指定terms的全局取值区间生成预测值,不会按因子各水平的实际协变量分布做范围限制,因此会出现部分因子水平的预测线条被外推到超出实际观测范围的情况。
解决方案:按因子水平裁剪预测范围
该方法无需修改模型逻辑,直接修改绘图数据即可精准匹配各水平的实际协变量范围:
- 先计算原始数据中每个因子水平对应的协变量取值上下限
- 提取
plot_model()生成的预测数据集 - 过滤掉各水平下超出实际取值范围的预测值、置信区间上下限
- 替换原绘图对象的数据后输出即可
对应代码示例:
# 加载依赖包 library(dplyr) library(sjPlot) # 步骤1:计算每个因子水平下协变量的实际取值范围 # 请将下方your_data替换为你拟合模型使用的原始数据集 cov_range <- your_data %>% group_by(FACTOR) %>% summarise( min_cov = min(COVARIATE, na.rm = TRUE), max_cov = max(COVARIATE, na.rm = TRUE) ) # 步骤2:生成初始预测图,提取内置预测数据 p1 <- plot_model(MODEL, type = 'pred', terms = c('COVARIATE[all]', 'FACTOR')) pred_data <- p1$data # 步骤3:过滤超出各水平实际范围的预测值 pred_data <- pred_data %>% left_join(cov_range, by = "FACTOR") %>% mutate( # 同时裁剪预测值和置信区间,不需要置信区间可以只保留predicted列 across(c(predicted, conf.low, conf.high), ~ifelse(x < min_cov | x > max_cov, NA, .x)) ) # 步骤4:替换原绘图数据后输出 p1$data <- pred_data p1
注意事项
- 替换为NA后ggplot会自动在对应位置断开线段,不会出现外推的多余部分,同时不会改变其余位置的预测结果
- 如果你的协变量在部分因子水平下还有更低的取值下限没有观测到,也会同步做截断,只保留实际有观测的区间的预测线条
内容的提问来源于stack exchange,提问作者striatum
相关产品推荐
相关产品推荐

