You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:08:09