R: anova或linear model 的 MAPE计算

来源:互联网 发布:java课设心得体会 编辑:程序博客网 时间:2024/05/17 22:53

在R的summary()基本功能里,对class为“lm"的数据是不提供MAPE的统计值的。有时候会需要自己去计算。

MAPE全称是Mean Absolute Percentage Error。 MAPE常用于统计与时间序列相关的模拟及预测的精确程度。而有时候在做时间序列类型的模型时,由于条件限制,并不一定会使用时间序列的理论去全盘套用,而是对数据做一些时间序列相关的变形(如carry over),然后用回归分析做模型,这时候想要看MAPE值,summary()是无法提供的(因为summary()在对线性模型进行总结的时候,是不考虑时间序列的统计值的,同理也可以知道Durbin Watson Test也是无法通过summary()直接得到的)。

MAPE的公式为:


At是被解释变量的实际值,而Ft是被解释变量的模拟/预测值。

由公式可知At - Ft即为残差Residual。用R进行coding时可进行简化。

那么接下来只需要读取公式中的每个元素,并计算平均值就可以了:

第一步:提取残差

在R的基本library里,有两种方法可以直接得到残差值summary{base}和proj{stats}:

方法一: summary()$residual:

resid <- summary(model)$residuals# residuals作为summary()中print outlist中的独立项,可直接用$读取# 可参考str(summary(model))
方法二: 读取proj()的最后一列.

prjc <- proj(model)resid <- prjc[, ncol(prjc)]# residual列在projection后print out数据的最后一列,无法用$读取# 可以结合 summary(proj(model))以及str(proj(model))做参考
第二步:提取对应被解释变量观测值

第二步需要留心的是,做linear model时,lm()经常会被要求忽略NA值(即missing value, lm()函数中相关参数为na.action = na.exclude),这些missing value不会被计入模型,那么我们在提取At时,也不能保留那些解释变量中有missing value的观测值所对应的被解释变量的观测值。这要如何做到呢?

在做第一步的时候,你会观察到,计入模型的有效观测值的条目会作为行名字存入matrix中(proj()),或者作为向量值得对应名称存入向量中(summary()$residuals)。当proj()中的residual被单独提取出来时,这一列的数据也变成一个向量。也就是说,做完第一步的处理之后,我们可以用names(resid)来读取residual对应的行数,然后从被解释变量中提取对应位置的数值即可。

active.row <- as.numeric(names(resid))# names()得到的是character值,需要将数据类型从character转换成numericA_t <- data$resp.var[active.row]# data - 建立model用的数据集# resp.var - model中的被解释变量
第三步:At中0值替换
有时候,计算MAPE时会碰到这种情况,即At在某行的数据为0,这样,Residual/At的到的结果就变成了一个无限值Inf。这种情况下,0值需要被替换成At的均值。

A_t[which(A_t == 0)] <- mean(A_t)
第四步:计算MAPE
进行完前三步之后,我们求得residual的绝对值,再进行一个简单的向量间除法,就可以得到一个包含所有观测值对应的Absolute Percentage Error。再对此向量求mean值,就是我们最终需要的MAPE了

mape <- mean(abs(resid)/A_t)print(mape)







0 0