一、拟合线性趋势
用lm函数可以拟合线性趋势,命令格式为:
lm(y~a+x1+x2,data=)
其中:y:因变量
a:指定是否需要常数项,a=1时有常数项,a=0时无常数项
x1,x2:自变量
data:数据框名,如果自变量和因变量不是独立输入变量而是共同存在某数据框,则需指定数据框名
例如:用线性函数拟合澳大利亚政府1981-1990每季度的消费支出数据
读取数据:
x<-c(8444,9215,8879,8990,8115,9457,8590,9294,8997,9574,9051,9+724,9120, 10143,9746,10074,9578,10817,10116, 10779,9901,11266,106
+86,10961,10121, 11333,10677,11325,10698,11624,11502, ,11393,10609,
+12077,11376,11777, 11225,12231,11884,12109)
输入自变量:
t<-c(1:40)
拟合模型:
x.fit<-lm(x~t)
查看拟合信息:
summary(x.fit)
可输出拟合信息:
回归方程估计结果:
绘制拟合效果图,可输入:
x<-ts(x)
plot(x)
abline(lm(x~t),col=2)
则输出图形:
二、拟合非线性趋势
如果序列表现出非线性趋势,则应该用nls函数进行曲线拟合,命令格式为:
nls(y~f(x1,x2,…xn),data=,start=)
其中:
y:因变量
x1,x2…xn:自变量
f:非线性函数
data:数据框名
start:如果用迭代法估计未知参数,可以指定迭代初始值
例如:对我国1949-2008化肥产量序列进行曲线拟合,根据序列的曲线特点,采用二次函数拟合:
输入:
a<-read.table("E:/R/data/file12.csv",sep=",",header = T)
x<-ts(a$output,start=1949)
t1<-c(1:60)
x.fit2<-nls(x~a+b*t1+c*t1^2,start = list(a=1,b=1,c=1))
summary(x.fit2)
可得如下结果:
即拟合模型为:
输入如下命令,可以观察拟合效果:
y<-predict(x.fit2)
y<-ts(y,start = 1949)
plot(x,type = "p")
lines(y,col=2,lwd=2)
拟合效果图如下:
三 平滑法
1,移动平均法
下载TTR程序包,并用library加载,其中的SMA函数可对序列作简单移动平均,命令格式为:
SMA(x,n=)
其中:x:序列名
n:移动平均期数
2,指数平滑法,分三种类型:简单指数平滑(适用于没有趋势的序列),Holt两参数平滑(适用于有线性趋势的序列),Holt-Winters三参数平滑(适用于有季节效应的序列)。
HoltWinters函数可以进行三种类型指数平滑拟合,命令格式如下:
HoltWinters(x,alpha=,beta=,gamma=,seasonal=)
其中:
x:序列名
alpha:随机波动部分的参数
beta:趋势部分的参数
gamma:季节部分的参数
(1)当alpha不指定,beta=F,gamma=F时,表示拟合简单指数平滑
(2)当alpha和beta不指定,gamma=F时,拟合Holt两参数指数平滑
(3)当三个参数都不指定时,拟合HoltWinters三参数指数平滑
seasonal:当拟合HoltWinters三参数模型时,要指定季节与趋势的关系
seasonal="additive"表示加法关系(默认项)
seasonal="multiplicative"表示乘法关系
例如:对1962年1月-1975年12月平均每头奶牛月产奶量序列进行HoltWinters三参数平滑,并预测未来两年的序列值。可输入:
b<-read.table("E:/R/data/file5.csv",sep=",",header = T)
x<-ts(b$milk,start = c(1962,1),frequency = 12)
x.fit<-HoltWinters(x)
x.fit
可以得出如下结果:
可以观察拟合效果图和预测效果图:
plot(x.fit)
x.fore<-forecast(x.fit,h=24)
plot(x.fore)
四 综合分析
当序列既有趋势,又有季节效应时,应该进行综合分析,综合分析时可采用加法模型和乘法模型:
- 加法模型:
- 乘法模型:
进行综合分析用的函数是decompose,命令格式为:
decompose(x,type=)
其中:x:序列名
type:指定是加法模型还是乘法模型
- type="additive",加法模型
- type="multiplicative",乘法模型
例如:对1993年1月到2000年12月中国社会消费品零售总额进行确定性因素分解
首先,读取数据,绘制时序图:
c<-read.table("E:/R/data/file14.csv",sep=",",header = T)
x<-ts(c$sales,start = c(1993,1),frequency = 12)
plot(x)
从图像可以看出,序列既有上升趋势,又有季节效应,而且季节波动幅度随着序列值的增大而增大,所以应采用乘法模型。
输入:
x.fit<-decompose(x,type="mult")
#确定性因素分解
x.fit$figure
plot(x.fit$figure,type = "o")
#查看季节指数,并画季节指数图
x.fit$trend
plot(x.fit$trend)
#查看趋势拟合值,并画趋势拟合图
x.fit$random
plot(x.fit$random)
#查看残差值,并画残差图
x.fit
plot(x.fit)
查看拟合值,并画出时序的因素分解图