r语言中trifit怎么用_【手把手教你】用R语言进行预测的基本过程

本文手把手教如何使用R语言进行时间序列预测,通过forecast包的wineind数据集展示了数据处理、建模和预测的过程。首先分析了数据的周期性,然后转换数据并建立线性回归模型,通过调整模型参数提高预测准确性。最终,通过预测和误差分析验证模型效果,平均百分误差率为7.73%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原标题:【手把手教你】用R语言进行预测的基本过程

欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区。 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入头条数据爱好者交流群,数据爱好者们都在这儿。

本例使用forecast包中自带的数据集wineind,它表示从1980年1月到1994年8月,由葡萄酒生产商销售的容量不到1L的澳大利亚酒的总量。这是典型的时间序列数据,进一步绘制得到下图。

葡萄酒销售量时间序列

从上图可以看出,该时间序列数据呈明显的周期性变化。

— 数据读入及处理

加载forecast包,使用自带数据集wineind。使用ACF函数查看wineind数据的自相关性,代码如下。

#读入数据

library(forecast)

acf(wineind,lag.max = 100)

得到如下图所示。

wineind数据的自相关图

图中圆点部分为自相关性比较明显的位置,可以初步使用近1、4、6、8、12期的数值建立指标,作为预测基础数据。另外,通过观察确定wineind的数据周期为一年,将1980年到1993年每年按月的曲线图放在一张图中,进一步观察,相应代码如下。

1

#观察曲线簇

2 len=

1993-

1980+

1

3 data

0=wineind[

1

:

12*len]

4 range

0=range(data

0)+c(-

100,

100)

5 plot(

1

:

12,

1

:

12,ylim=range

0,col=

'white', xlab=

"月份", ylab=

"销量")

6

for(i

in

1

:len)

7 {

8 points(

1

:

12,wineind[(

12*(i-

1)+

1)

:(

12*i)])

9 lines(

1

:

12,wineind[(

12*(i-

1)+

1)

:(

12*i)], lty=

2)

10 }

相应图参见下图。

wineind数据与月份的关系图

由图可知,月份与销量线性关系明显,应该考虑进建模基础数据,用于预测。至此,需要将wineind的原始数据,处理成如下表所示格式,输出建模基础数据集。

表 基础数据集属性配置表

数据转换的代码如下。

1

#对数据按指定格式进行转换

2 Month=

NULL

3 DstValue=

NULL

4 RecentVal1=

NULL

5 RecentVal4=

NULL

6 RecentVal6=

NULL

7 RecentVal8=

NULL

8 RecentVal12=

NULL

9

#替换掉太大或太小的值

10 wineind[wineind<

18000]=

18000

11 wineind[wineind>

38000]=

38000

12

for(

i in(12+1):(length(wineind)-1))13{

14 Month

1)

15 DstValue

1])

16 RecentVal1

17 RecentVal4

3])

18 RecentVal6

5])

19 RecentVal8

7])

20 RecentVal12

11])

21 }

22 preData=data.frame(Month,DstValue,RecentVal1,RecentVal4,RecentVal6,

23 RecentVal8,RecentVal12)

24 head(preData)

25

##Month DstValue RecentVal1 RecentVal4 RecentVal6 RecentVal8 RecentVal12

26

## 12180001800022591237391922718000

27

## 23200081800026786211332289320016

28

## 34213542000829740225912373918000

29

## 45194982135418000267862113318019

30

## 56221251949818000297402259119227

31

## 67258172212520008180002678622893

32

#画出散点矩阵图

33 plot(preData)

相应图如下图所示。

— 建立模型

根据上一步输出的基础数据,提取150行作为训练数据,剩下的数据作为测试数据。数据分割及建模的代码如下。

#分离训练集与测试集 trainData=preData[

1:

150,]

testData=preData[

151:

163,]

#建立模型 lm.fit

8+RecentVal12,data=trainData) summary(lm.fit)

##

## Call:

## lm(formula = DstValue ~ Month + RecentVal1 + RecentVal4 + RecentVal6 +

## RecentVal8 + RecentVal12, data = trainData)

##

## Residuals:

## Min 1Q Median 3Q Max

## -4806.5 -1549.1 -171.8 1368.7 6763.3

##

## Coefficients:

## Estimate Std. Error t value Pr(>|t|)

## (Intercept) 2.214e+03 1.987e+03 1.114 0.26714

## Month 3.855e+02 8.955e+01 4.305 3.08e-05 ***

## RecentVal1 -2.964e-03 3.354e-02 -0.088 0.92971

## RecentVal4 7.227e-02 3.567e-02 2.026 0.04463 *

## RecentVal6 -1.825e-02 3.759e-02 -0.486 0.62804

## RecentVal8 1.123e-01 3.903e-02 2.876 0.00464 **

## RecentVal12 6.701e-01 5.921e-02 11.316 < 2e-16 ***

## ---

## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##

## Residual standard error: 1989 on 143 degrees of freedom

## Multiple R-squared: 0.848, Adjusted R-squared: 0.8416

## F-statistic: 133 on 6 and 143 DF, p-value: < 2.2e-16

可以看到,调整后的R平方达到0.84,作为模型来讲,基本可以使用。但是看下误差项(Intercept)的P值为0.26714,不显著。所以,目前的模型还需要进一步调整,使得误差项(Intercept)的P值低于0.05或0.01。另外,变量RecentVal1 和RecentVal6的P值都较大,明显不显著,这里考虑变量之间的相互影响,暂时保留。几个变量中,除了RecentVal12与目标变量呈现比较明显的线性关系,其他变量跟目标变量的线性关系并不明显。为了让模型拟合得更好,现在开始尝试非线性的方法。由于变量RecentVal1和RecentVal6对目标变量的影响不明显。这里主要考虑Month、RecentVal4、RecentVal8三个变量对目标变量的非线性影响。在所有的非线性方法中,多项式比较适合单个变量的衍生变换。因此,这里对Month、RecentVal4、RecentVal8三个变量使用多项式的方法,尝试最高次数为5的情况下,模型的拟合情况。

去掉P值较大的三个变量I(RecentVal4^3)、I(RecentVal4^4)、I(RecentVal4^5)后,再拟合一次模型,从拟合结果可知,所有系数的P值都小于0.05,影响明显,且拟合优度为0.86,可用于预测。lm.fit就是我们建立的用于时间序列预测的线性回归模型。

— 预测及误差分析

用lm.fit作为预测模型,对预测数据源testData进行预测。代码如下。

#对新数据进行预测 testData$pred=predict(lm.fit,testData)

#计算百分误差率 testData$diff=

abs(testData$DstValue-testData$pred)/testData$DstValue testData

## Month DstValue RecentVal1 RecentVal4 RecentVal6 RecentVal8 RecentVal12

## 15310284962272424735268051946325650

## 15411328572849629356252362435230923

## 15512371983285731234247352680537240

## 1561180003719822724293562523618000

## 1572227841800028496312342473519463

## 1583235652278432857227242935624352

## 1594263232356537198284963123426805

## 1605237792632318000328572272425236

## 1616275492377922784371982849624735

## 1627296602754923565180003285729356

## 1638233562966026323227843719831234

## pred diff

## 15325154.080.117276814

## 15431448.290.042874098

## 15537063.760.003608861

## 15618724.460.040247684

## 15720238.790.111710356

## 15824022.790.019426610

## 15925778.010.020704134

## 16024900.350.047157117

## 16124405.940.114089645

## 16230005.150.011636800

## 16330888.460.322506541 summary(testData)

## Month DstValue RecentVal1 RecentVal4

## Min. : 1.000 Min. :18000 Min. :18000 Min. :18000

## 1st Qu.: 3.5001st Qu.:234611st Qu.:231751st Qu.:23175

## Median : 6.000 Median :26323 Median :26323 Median :26323

## Mean : 6.273 Mean :26688 Mean :26630 Mean :27025

## 3rd Qu.: 9.0003rd Qu.:290783rd Qu.:290783rd Qu.:30295

## Max. :12.000 Max. :37198 Max. :37198 Max. :37198

## RecentVal6 RecentVal8 RecentVal12 pred

## Min. :18000 Min. :19463 Min. :18000 Min. :18724

## 1st Qu.:237601st Qu.:245441st Qu.:245441st Qu.:24214

## Median :26805 Median :26805 Median :25650 Median :25154

## Mean :27220 Mean :27496 Mean :26636 Mean :26603

## 3rd Qu.:302953rd Qu.:302953rd Qu.:301403rd Qu.:30447

## Max. :37198 Max. :37198 Max. :37240 Max. :37064

## diff

## Min. :0.003609

## 1st Qu.:0.020065

## Median :0.042874

## Mean :0.077385

## 3rd Qu.:0.112900

## Max. :0.322506

从统计结果中,可以看到,对预测数据集共11条记录进行预测,最小百分误差率为0.36%,最大百分误差率为32.25%,平均百分误差率为7.73%。预测结果还是很不错的,除了最后一条记录,预测值为30888.46,取整为30888与真实结果23356差别较大,根据笔者的经验,该月可能遇到什么特殊情况(如气象灾害导致葡萄收成不好等),导致高估了葡萄酒的销量。当预测不准时,不见得都是模型的问题,有可能是数据的问题,这时需要从数据中去发现问题,并进一步解决问题,预测的目的就是为了改变。有兴趣的读者,还可以使用纵横两年的数据关系,构建指标体系,有望对模型进一步优化。

——节选自《R语言预测实战》 已获得作者授权

转载请保留以下内容:

本文来源自天善社区datakong老师的博客(公众号)。

原文链接: https://ask.hellobi.com/blog/datakong/7664返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值