R语言logit模型循环预测售票概率输出异常及结果存储问题
问题原因
输出里固定出现的440是你用subset筛出的SpielRevenue样本在原始test数据框中的原生行名。R中predict.glm返回的预测结果是带原始观测行名的命名向量,循环过程中你只修改了样本的票价取值,没有改动行名属性,所以每次输出都会保留原行名440,不会自动匹配当前遍历的票价。
解决方案
不用手动对齐票价和概率值,提前创建存储结果的结构,循环中同步存入票价和对应预测结果即可,最终可直接输出符合你要求格式的结果,同时自动生成数据框对象。
循环实现代码
# 定义要遍历的票价区间 Preis <- 1:100 # 筛选固定特征的基准预测样本 SpielRevenue <- subset(test, Datum == "2018-12-02" & Kategorie == "4" & Block == "15E") # 初始化空结果数据框,两列分别存储票价、对应售出门票的概率 pred_result <- data.frame( Preis = integer(100), sell_prob = numeric(100) ) # 遍历票价完成预测 for (i in seq_along(Preis)) { current_p <- Preis[i] SpielRevenue$Preis <- current_p # 用as.numeric去掉预测值的行名属性,只保留概率值 prob <- as.numeric(predict(Logit_Gegner, SpielRevenue, type = "response")) pred_result$Preis[i] <- current_p pred_result$sell_prob[i] <- prob } # 将数据框行名设置为对应票价,输出时即可匹配你要的显示格式 rownames(pred_result) <- pred_result$Preis # 打印查看结果 print(pred_result)
运行后输出格式如下,和你预期的完全一致:
Preis sell_prob 1 1 0.6747067 2 2 0.6688503 3 3 0.6629412 4 4 0.6569808 5 5 0.6509704 ...
后续要计算可保证门票售出的最高定价,直接在pred_result中按你设定的售票概率阈值(比如概率≥0.95)筛选最高票价即可,无需手动计数。
更高效的向量化写法(无需循环):
R中向量化运算比for循环效率更高,你可以直接复制100份基准样本、批量赋值票价后一次性完成预测,代码更简洁,结果和循环写法完全一致:# 复制100份基准样本 SpielRevenue_multi <- SpielRevenue[rep(1, 100), ] # 批量赋值1-100的票价 SpielRevenue_multi$Preis <- 1:100 # 一次性完成所有票价的概率预测 SpielRevenue_multi$sell_prob <- predict( Logit_Gegner, SpielRevenue_multi, type = "response" ) # 设置行名为票价 rownames(SpielRevenue_multi) <- 1:100
内容的提问来源于stack exchange,提问作者Louisa Fritz
相关产品推荐
相关产品推荐

