R语言简单指数平滑(自编函数)

系列文章目录

R语言利用贝叶斯分类法(klaR程序包),训练数据集,预测数据的分类
R语言载入arules程序包的Epub数据集,使用Apriori算法,进行关联规则分析
R语言进行系统聚类分析并作图(数据来源国家统计局)
R语言和RStudio安装,载入TXT、CSV和XLSX(利用RODBC)文件



前言

这其实是课程作业,要求如图:
在这里插入图片描述


一、以AirPassengers数据集用ses()函数做简单指数平滑预测

代码如下:

install.packages("forecast")
library(forecast)
model<-ses(AirPassengers)
forecast(model,h=1)
autoplot(model)+
autolayer(fitted(model))

执行结果如图:
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
在这里插入图片描述
用summary方法能查看原ses()方法的参数,可知默认的alpha值为0.9999,默认的S0值为111.9892。

summary(model)

在这里插入图片描述

二、编写自己的函数实现简单指数平滑

1.引入库

代码如下:

myses1 <- function(y,a,s) {
  l=rep(1,145);
  l[1]=a*y[1]+(1-a)*s;
  for(t in 2:144 ){
    l[t]=a*y[t]+(1-a)*l[t-1];
  }
  y[145]=l[144];
  return(y[145]);
}
y<-matrix(AirPassengers,nrow = 1,ncol = 144)
model1<-myses(y,0.9999,111.9892)
forecast(model1,h=1)

执行结果如图:
在这里插入图片描述
如图所示,确实给出了和ses()一样的执行结果,即431.9958.

summary(model1)

在这里插入图片描述

三、修改函数,以返回平方误差之和

myses2 <- function(y,a,s) {
  l=rep(1,145);
  l[1]=a*y[1]+(1-a)*s;
  VAR_sum=(y[1]-s)*(y[1]-s);
  for(t in 2:144 ){
    l[t]=a*y[t]+(1-a)*l[t-1];
    sum=sum+(y[t]-l[t])*(y[t]-l[t]);
  }
  return(sum);
}
y<-matrix(AirPassengers,nrow = 1,ncol = 144)
sum<-myses2(y,0.9999,111.9892)
sum

在这里插入图片描述

四、用optim()函数找到a和s的最佳值

myses3 <- function(z) {
  a=z[1]
  s=z[2]
  l=rep(1,145);
  var_y=matrix(AirPassengers,nrow = 1,ncol = 144)
  l[1]=a*y[1]+(1-a)*s;
  VAR_sum=(y[1]-s)*(y[1]-s);
  for(t in 2:144 ){
    l[t]=a*y[t]+(1-a)*l[t-1];
    sum=sum+(y[t]-l[t])*(y[t]-l[t]);
  }
  return(sum);
}
optim(c(0.9999,111.9892),fn=myses3,lower =c(0,0),upper = c(1,Inf),method = "L-BFGS-B")

在这里插入图片描述

五、将myses2()和myses3()结合起来,同时找A和S0的最佳值并返回下一期的预测值

myses4<-function(){
  
    myses3 <- function(z) {
      a=z[1]
      s=z[2]
      l=rep(1,144);
      var_y=matrix(AirPassengers,nrow = 1,ncol = 144)
      l[1]=a*y[1]+(1-a)*s;
      VAR_sum=(y[1]-s)*(y[1]-s);
      for(t in 2:144 ){
        l[t]=a*y[t]+(1-a)*l[t-1];
        sum=sum+(y[t]-l[t])*(y[t]-l[t]);
      }
      return(sum);
    }
    
    a=optim(c(0.9999,111.9892),fn=myses3,lower =c(0,0),upper = c(1,Inf),method = "L-BFGS-B")$par[1]
    s=optim(c(0.9999,111.9892),fn=myses3,lower =c(0,0),upper = c(1,Inf),method = "L-BFGS-B")$par[2]

    
    myses1 <- function(y,a,s) {
      l=rep(1,144);
      l[1]=a*y[1]+(1-a)*s;
      for(t in 2:144 ){
        l[t]=a*y[t]+(1-a)*l[t-1];
      }
      y[145]=l[144];
      return(y[145]);
    }
    y<-matrix(AirPassengers,nrow = 1,ncol = 144);
    
    print("a和s0的最优值为:");
    print(optim(c(0.9999,111.9892),fn=myses3,lower =c(0,0),upper = c(1,Inf),method = "L-BFGS-B")$par);
    print("下一期的预测值为:");
    print(myses1(y,a,s));
  
}

在这里插入图片描述


总结

以上就是R语言实现简单指数平滑的教程。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值