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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:09:15