在R中使用泊松回归进行预测时出现不准确的情况。

3
我正在尝试根据收集的历史数据对网站访问量进行预测。我认为这是一个可以使用泊松回归的场景。
输入包括6列: id(网站ID)、日、月、年、星期几、访问量。
因此,我们的输入是一个CSV文件,其中列的格式为:"2","22","7","2015","6","751"。
我正在尝试根据先前的访问量来预测访问次数。网站的大小可能会有所不同,因此我将它们分为5个类别: 1. 几乎为零 (平均值 < 1) 2. 非常小 (平均值 < 100) 3. 小 (平均值 < 1000) 4. 中等 (平均值 < 50,000) 5. 大 (平均值 < 500,000)
因此,我创建了第七列名为类型,它是从1到5的整数。
我的代码如下:
train = read.csv("train.csv", header = TRUE)
model<-glm(visits ~ type + day + month + year + dayofweek, train, family=poisson)
summary(model)
P = predict(model, newdata = train)
imp = round(P)
imp

预测值与实际值相差甚远,我原本以为可以得到实际值的10-20%,但未能如愿,大多数预测值比实际值高200-300%。而这是在训练数据集上进行的,应该提供了一种乐观的视角。
我刚接触R,并且在解释汇总命令返回的数据方面遇到了一些问题。以下是它返回的内容:

Call: glm(formula = visits ~ type + day + month + year + dayofweek, family = poisson, data = train)

Deviance Residuals: Min 1Q Median 3Q Max
-571.05 -44.04 -11.33 -5.14 734.43

Coefficients:

            Estimate Std. Error  z value Pr(>|z|)     

(Intercept) -9.998e+02  6.810e-01 -1468.19   <2e-16 *** 

type         2.368e+00  1.280e-04 18498.53   <2e-16 *** 

day         -2.473e-04  6.273e-06   -39.42   <2e-16 *** 

month        1.658e-02  3.474e-05   477.31   <2e-16 *** 

year         4.963e-01  3.378e-04  1469.31   <2e-16 *** 

dayofweek   -3.783e-02  2.621e-05 -1443.46   <2e-16 ***

--- Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

Null deviance: 1239161821 on 12370 degrees of freedom Residual deviance: 157095033 on 12365 degrees of freedom AIC: 157176273

Number of Fisher Scoring iterations: 5

有人能更详细地描述摘要命令返回的值以及在泊松回归中应该如何输出更好的预测结果吗?在R中是否有更好的方法来处理基于时间演化的数据估计值?

LE. link to train.csv file.


没有你的数据,基本上无法帮助你。 - adaien
@adiana 我已经添加了train.csv文件 - Dragos Geornoiu
@RichardTelford 我认为这是一个很好的表示日期值的方式,我认为日期应该对预测值有很大的影响,它必须基于收集到的历史数据。如果您有更好的建议,请告诉我,我将不胜感激 :) - Dragos Geornoiu
@ayhan非常感谢,我会做更多的研究。我查看了如何在回归模型中表示日期,并找到了一个类似于我所做的事情的示例,但我理解你的意思。作为第一个想法,将第一个日期表示为1并从那里迭代是否是更好的解决方案?第50天将是50,依此类推,以便每天都是前一天+1? - Dragos Geornoiu
那将是您的时间索引,您可以使用它。但是,如果您还想纳入季节性,则需要为每个月(或基于您的预期和探索性分析的周、星期几)设置虚拟变量。这里有一个简单的例子:https://www.otexts.org/fpp/5/2 - ayhan
显示剩余2条评论
1个回答

4

你的问题出在 predict 命令上。在 predict.glm 中,默认情况下是基于链接比例进行预测的。如果你想要与原始数据直接比较的预测结果,需要使用参数 type = "response"

P <- predict(model, newdata = train, type = "response")

模型设置不够理想。也许应该将月份作为分类变量(as.factor)加入,并且需要更多地考虑日期(每个月的第31天后跟随着下个月的第1天)。预测因子“类型”也是可疑的,因为类型直接来自于响应。

您的模型也存在严重的过度离散化问题。这可能表明存在缺失的预测因子或其他问题。

您还应考虑使用混合效应模型。


如果我包含一个日期列,将每个日期表示为整数,从第一个历史日期表示为1到最后一个日期,那么我是否仍需要包括月份作为分类变量?为什么直接从响应中派生“类型”会成为问题? - Dragos Geornoiu
如果您认为可能存在季节性影响,那么就需要这样做。 - Richard Telford
我将尝试使用月份和季度来实现季节效应。我需要对为什么类型变量不应直接从响应中派生以及混合效应模型进行一些研究。我将接受这个答案,因为它解决了我最初在回归模型中如何表示日期的问题。谢谢! - Dragos Geornoiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接