使用visreg包绘制逻辑回归模型时,添加by参数提示‘数据未找到’报错
解决visreg绘制逻辑回归模型时by参数的“数据未找到”问题
我之前也碰到过visreg使用by参数时找不到数据的情况,结合你的问题描述,我们可以从几个方向排查和解决:
一、先确保数据集和模型的环境一致性
首先,你的数据集处理流程没问题,但要确保处理后的nassCDS在全局工作环境中,并且拟合模型时明确绑定这个数据集。很多时候报错是因为模型没有正确关联到数据集,导致visreg无法找到分组变量dvcat的数据。
重新执行数据集处理和模型拟合的代码:
library(dplyr) library(sjmisc) library(visreg) # 重新处理数据集,确保变量转换正确 nassCDS <- nassCDS %>% mutate(dead1 = as.integer(dead)) %>% mutate(alive = rec(dead1, rec = "2=0; 1=1")) %>% select(seatbelt, dead, alive, dvcat, sex, ageOFocc, everything()) %>% select(-dead1) %>% # 确保airbag、seatbelt是数值型,dvcat转成因子(分类变量必须转因子!) mutate(across(c(airbag, seatbelt), as.numeric), dvcat = as.factor(dvcat)) # 重新拟合模型,务必明确指定data参数,不要省略 m3 <- glm(alive ~ seatbelt*dvcat + sex + ageOFocc + airbag, family = binomial, data = nassCDS)
二、调用visreg时明确指定数据和环境
然后调用visreg的时候,除了传data参数,再加上envir = environment()强制在当前环境查找数据:
visreg(m3, "seatbelt", by = "dvcat", scale = "response", data = nassCDS, envir = environment())
三、如果还是不行,手动提取数据绘图
如果上述方法仍报错,可以先用visregData()函数手动提取绘图所需的数据,再用ggplot2手动绘制(这种方法更灵活,也能避开环境问题):
# 提取visreg的绘图数据 vr_data <- visregData(m3, "seatbelt", by = "dvcat", scale = "response", data = nassCDS) # 用ggplot2绘图 library(ggplot2) ggplot(vr_data, aes(x = seatbelt, y = visregFit, color = dvcat)) + geom_line(linewidth = 1) + # 添加置信区间 geom_ribbon(aes(ymin = visregLwr, ymax = visregUpr, fill = dvcat), alpha = 0.2) + labs(x = "Seatbelt Usage", y = "Probability of Being Alive", color = "Crash Severity", fill = "Crash Severity") + theme_bw()
为什么会出现这个问题?
- visreg使用
by参数时,需要完整访问所有模型变量的原始数据,尤其是分组变量。如果模型拟合时没有明确绑定数据集,或者数据集在拟合后被修改/转移了环境,visreg就会找不到对应的数据。 - 另外,分类变量(比如
dvcat)如果没有转成因子类型,visreg处理分组时也可能出现隐性错误,所以务必将分组变量转为因子。
内容的提问来源于stack exchange,提问作者jan
相关产品推荐
相关产品推荐

