ggeffects包绘制非线性模型置信区间未显示问题求解
ggeffects绘制nlsLM非线性模型无置信区间的解决方案
问题复现
使用ggeffects为minpack.lm::nlsLM()拟合的非线性模型绘制预测图时,输出结果未显示默认应带的置信区间,复现代码如下:
# 加载依赖包 library(ggplot2) library(minpack.lm) library(ggeffects) library(dplyr) # 读入甲虫侵染数据集 coleo<- read.csv("coleo-infest-tree.csv") coleo$DL<-as.numeric(coleo$DL) coleo$V<-as.numeric(coleo$V) # 拟合非线性幂模型 m.c.coleo<-nlsLM(V ~ b1 + b2 * I(DL^b3), start = list(b1 = 0.2164, b2 = 1.6264, b3 = 1), data = coleo) summary(m.c.coleo) # 绘制预测图 ggpredict(m.c.coleo, terms = "DL [all]") %>% plot(add.data = TRUE)
核心原因
nlsLM()默认拟合输出的模型对象不会自动携带可用于推断的参数方差-协方差矩阵,ggpredict()计算预测置信区间必须依赖协方差矩阵推导预测标准误,无法获取该矩阵时会默认跳过置信区间绘制,且不会抛出显性报错。
修复方法
两种方案任选其一即可:
- 方案1:调用
ggpredict()时手动传入协方差矩阵
直接在函数内指定vcov参数,传入模型的协方差矩阵即可正常计算置信区间,代码如下:ggpredict( m.c.coleo, terms = "DL [all]", vcov = vcov(m.c.coleo), # 手动传入协方差矩阵 ci_level = 0.95 # 可按需调整置信水平 ) %>% plot(add.data = TRUE) - 方案2:拟合模型时提前保留海森矩阵
如果后续需要多次对该模型做推断计算,可以在nlsLM()拟合阶段设置hessian = TRUE,让模型输出时自带用于计算协方差的海森矩阵,后续调用ggpredict()时无需额外设置参数即可自动识别并绘制置信区间:# 拟合时开启海森矩阵计算 m.c.coleo<-nlsLM( V ~ b1 + b2 * I(DL^b3), start = list(b1 = 0.2164, b2 = 1.6264, b3 = 1), data = coleo, hessian = TRUE ) # 直接调用即可正常显示置信区间 ggpredict(m.c.coleo, terms = "DL [all]") %>% plot(add.data = TRUE)
补充说明:上述方法得到的是基于参数正态近似的Wald置信区间,若样本量较小、模型非线性程度较高,建议使用bootstrap方法计算置信区间结果更可靠,可通过
ggpredict()的自助法相关参数实现,仅计算速度会慢于默认近似方法。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

