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

如何创建规范的预测概率图?基于faraway包debt数据集的问题求助

错误排查与修正方案

核心错误点

  1. 变量处理顺序颠倒:先构建模型再转换变量类型,导致模型使用的是未转换的原始变量,后续的因子转换对已生成的mod1完全无效。同时错误地将连续协变量prodebt转为因子,让模型把它当作分类变量处理,无法生成连续平滑的预测概率曲线。
  2. 预测参数不匹配:predict时newdata用了income=inclevels,但模型的协变量是prodebt,变量名完全错误。R会默认调用原数据集的prodebt(已转成464个水平的因子),但inclevels有465个值,因此触发行数不匹配的警告。
  3. 绘图对应关系错位:图例的线条类型(lty)与实际绘制的曲线对应错误,导致图例说明和曲线不匹配。

修正后的完整代码

# 加载依赖包与数据集
library(faraway)
library(nnet) # multinom函数属于nnet包
data(debt)

# 正确处理变量类型:响应变量转因子,协变量保持连续型
debt$ccarduse <- as.factor(debt$ccarduse)
# prodebt为连续变量,无需转因子(若原数据是数值型)

# 重新构建多分类逻辑回归模型
mod1 <- multinom(ccarduse ~ prodebt, data = debt)

# 生成合理的预测序列:基于原数据prodebt的范围生成100个连续点,保证曲线平滑
prodebt_seq <- seq(min(debt$prodebt), max(debt$prodebt), length.out = 100)
newdata <- data.frame(prodebt = prodebt_seq) # 变量名必须与模型协变量一致

# 预测各分类的概率
preds <- predict(mod1, newdata = newdata, type = "probs")

# 绘制优化后的预测概率图
plot(prodebt_seq, preds[,1], type = "l", lwd = 2, ylim = c(0, 1),
     xlab = "prodebt", ylab = "Probabilities of credit card use",
     cex.lab = 1.3, cex.axis = 1.3)
lines(prodebt_seq, preds[,2], lty = 2, lwd = 2)
lines(prodebt_seq, preds[,3], lty = 3, lwd = 2)
# 图例直接使用响应变量的水平,避免手动输入出错
legend("topright", legend = levels(debt$ccarduse),
       lty = c(1, 2, 3), lwd = 2, cex = 1.2)

关键优化说明

  • 变量逻辑修正:先处理变量类型再建模,确保模型识别多分类响应,同时保留prodebt的连续属性,让模型拟合连续变量的边际效应,生成平滑的概率曲线。
  • 预测逻辑修正:使用与模型一致的变量名prodebt,并基于原数据的实际范围生成预测点,既解决了警告问题,又保证预测结果的合理性。
  • 绘图细节优化:调整y轴范围为概率的合理区间(0-1),增加线条宽度提升可读性,图例直接调用响应变量的水平值,避免手动对应错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:25:20