逻辑回归分类数据预测概率ggplot绘制问题求助
R逻辑回归预测概率曲线绘制问题排查与解决方案
错误原因
- 预测数据集的Location因子水平与训练集不匹配:训练用df的Location取值为
"A"/"B"/"C",你生成预测数据时用rep(0:2, each=100)转因子,水平完全不对应,导致predict函数无法匹配分组直接报错。 - 预测数据集行数不匹配:3组Location各需要100个Density值,总数据量应为300行,但你写的
rep(seq(from=0, to=1,length.out=100),2)仅生成200个Density值,和Location的300行长度不一致,合并时会报错。 - 非必要的数据集调用:生成预测数据时不需要用
with(c_freq_pca, ...),你的模型是基于df训练的,直接构造独立的预测数据集即可。 - glm参数写法不规范:
na.action = na.omit()加括号会直接执行函数,正确写法是传入函数名na.action = na.omit,若训练集无缺失值该问题不会触发报错,但属于不规范写法。
完整可运行实现代码
首先加载需要的包:
library(ggplot2)
构造示例训练数据:
df <- data.frame( Choice = c(0,1,1,0,1,0,1,0,1,0), Density = c(0.7,0.3,0.2,0.6,0.2,0.8,0.2,0.9,0.1,0.9), Location = factor(c("A","B","B","A","C","A","B","A","C","A")) )
构建逻辑回归模型:
logit <- glm(Choice ~ Density + Location, family = binomial(link = "logit"), na.action = na.omit, data = df)
构造匹配模型要求的预测数据集:
newdata <- data.frame( Density = rep(seq(from = 0, to = 1, length.out = 100), 3), # 3组各100个密度值,共300行 Location = factor(rep(c("A","B","C"), each = 100), levels = levels(df$Location)) # 水平和训练集完全对齐 )
计算预测值与概率:
# 计算预测值与标准误 newdata <- cbind(newdata, predict(logit, newdata, type = "link", se = TRUE)) # 转换为0-1区间的预测概率 newdata$PredictedProb <- plogis(newdata$fit)
绘制预测概率曲线:
ggplot(newdata, aes(x = Density, y = PredictedProb, color = Location)) + geom_line(linewidth = 1) + labs(x = "Density", y = "预测概率") + theme_bw()
输出说明
运行上述代码会得到符合预期的结果:x轴为Density取值,y轴为0-1区间的预测概率,共3条对应Location A/B/C的曲线,且整体随Density升高预测概率呈下降趋势。
内容的提问来源于stack exchange,提问作者Bluecanoe
相关产品推荐
相关产品推荐

