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

plot_models能否设置type="pred"?报错问题求助

错误原因与解决方案

错误解释

你遇到的invalid 'y' type in 'x || y'错误,本质是plot_models()(sjPlot包函数)在type="pred"模式下的内部逻辑冲突:

  • 该函数处理多模型时,会默认检查模型是否有零膨胀(zero-inflated)或离散参数(dispersion)属性,但你用的是普通线性回归(lm),这类模型根本没有这些属性,导致判断逻辑中||运算符两边的变量类型不匹配(比如一边是逻辑值,另一边是NULL),触发类型错误。

关于plot_models(type="pred")的支持情况

plot_models()不支持多模型同时使用type="pred"参数,这个参数是为单个模型的plot_model()设计的,所以单个模型调用正常,多模型就会报错。

解决方案

方案1:分别生成单模型预测图再组合

用plot_model()单独生成每个模型的预测图,再用patchwork包合并展示:

library(sjPlot)
library(patchwork)

data(efc)

fit1 <- lm(barthtot ~ c160age + c12hour + c161sex + c172code, data = efc)
fit2 <- lm(neg_c_7 ~ c160age + c12hour + c161sex + c172code, data = efc)
fit3 <- lm(tot_sc_e ~ c160age + c12hour + c161sex + c172code, data = efc)

# 生成每个模型的预测图
p1 <- plot_model(fit1, type="pred", rm.terms = c("c12hour", "c161sex", "c172code")) + ggtitle("barthtot 预测值 vs 年龄")
p2 <- plot_model(fit2, type="pred", rm.terms = c("c12hour", "c161sex", "c172code")) + ggtitle("neg_c_7 预测值 vs 年龄")
p3 <- plot_model(fit3, type="pred", rm.terms = c("c12hour", "c161sex", "c172code")) + ggtitle("tot_sc_e 预测值 vs 年龄")

# 组合三张图
p1 + p2 + p3

方案2:手动计算预测值后用ggplot2绘图

如果需要在同一张图中对比多模型的预测趋势,可以手动计算预测值,再用ggplot2可视化:

library(ggplot2)
library(dplyr)
library(tidyr)

# 构造仅包含目标变量(年龄)的新数据
new_data <- tibble(c160age = seq(min(efc$c160age), max(efc$c160age), length.out = 100))

# 计算每个模型的预测值并整理格式
new_data <- new_data %>%
  mutate(
    barthtot = predict(fit1, newdata = .),
    neg_c_7 = predict(fit2, newdata = .),
    tot_sc_e = predict(fit3, newdata = .)
  ) %>%
  pivot_longer(cols = -c160age, names_to = "模型", values_to = "预测值")

# 绘制对比图
ggplot(new_data, aes(x = c160age, y = 预测值, color = 模型)) +
  geom_line(linewidth = 1) +
  labs(x = "年龄", y = "预测值", color = "模型") +
  theme_minimal()

内容的提问来源于stack exchange,提问作者mango123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:45:32