0

I have imitated the holtwinter function using a for loop and now i am trying to optimize the value of alpha, beta, gamma. But when i run the optim function it is returning the same value i passed as a starting point. i a, little new to R so seeking help.

i will provide the code i have written and the data sheet i am using.

i have tried optim as per the given format but unable to get the desired result

sol3<-function(par){
  bal_data<- read.csv("C:/Gitaish_bkp/gitaish/Oracle/ittemar/kpmg docs/hw/bal_data.csv", header=TRUE,sep=",",stringsAsFactors =FALSE)
  final_trend<-data.frame(u= numeric(0))
  #alpha<-par[1]
  #beta<-par[2]
  #gamma<-par[3]
  for (i in 5:11){
    data_cur<-as.numeric(bal_data$data[i])
    data_u_prev<-as.numeric(bal_data$u[i-1])
    data_v_prev<-as.numeric(bal_data$v[i-1])
    bal_data$u[i]<-(x[1]*data_cur/bal_data$forecast[i-4]+(1-x[1])*(data_u_prev+data_v_prev))
    data_u_cur<-as.numeric(bal_data$u[i])
    bal_data$v[i]<-(x[2]*(data_u_cur-data_u_prev)+(1-x[2])*data_v_prev)
    data_v_cur<-as.numeric(bal_data$v[i])
    bal_data$forecast[i]<-(x[3]*(bal_data$data[i]/data_u_cur)+(1-x[3])*bal_data$forecast[i-4])
    bal_data$PV[i]<-(data_u_prev+data_v_prev)*bal_data$forecast[i-4]
    i<-i+1
    dt<-sum(bal_data$data)
    pred<-sum(bal_data$pv)
   return(dt^2-pred^2)
  }
}

x<-c(0.9,0.9,0.9)
result<-optim(x,sol3)

> result$par
[1] 0.9 0.9 0.9

bELOW IS THE data i am using for optimization on which the code is written.

data                 u          v     forecast
11551714.57                   1.0506142
10860713.81                   0.9877685
10989780.35                   0.9995069
10578597.92  10995202   0     0.9621104
10343260.81             0   
10481946.15         
10144200.01         
10486943.26         
10701326.12         
10530507.92         
10633318.04

2 Answers2

0

Sorry i was just trying few options actually the code is posted below, which has par variable.

gttt1<-function(par){
  bal_data<- read.csv("C:/Gitaish_bkp/gitaish/Oracle/ittemar/kpmg docs/hw/bal_data.csv", header=TRUE,sep=",",stringsAsFactors =FALSE)
  final_trend<-data.frame(u= numeric(0))
  #alpha<-0.5
  #beta<-0
  #gamma<-0.76
  for (i in 5:11){
    data_cur<-as.numeric(bal_data$data[i])
    data_u_prev<-as.numeric(bal_data$u[i-1])
    data_v_prev<-as.numeric(bal_data$v[i-1])
    bal_data$u[i]<-(par[1]*data_cur/bal_data$forecast[i-4]+(1-par[1])*(data_u_prev+data_v_prev))
    data_u_cur<-as.numeric(bal_data$u[i])
    bal_data$v[i]<-(par[2]*(data_u_cur-data_u_prev)+(1-par[2])*data_v_prev)
    data_v_cur<-as.numeric(bal_data$v[i])
    bal_data$forecast[i]<-(par[3]*(bal_data$data[i]/data_u_cur)+(1-par[3])*bal_data$forecast[i-4])
    bal_data$PV[i]<-(data_u_prev+data_v_prev)*bal_data$forecast[i-4]
    i<-i+1
    dt<-sum(bal_data$data)
    pred<-sum(bal_data$pv)
    return(dt^2-pred^2)
  }
}

result<-optim(par=c(0,0,0),gttt1)
result$par
[1] 0 0 0
0

Dput Output for the input dataframe

structure(list(row_values = 1:11, cumm_days = c(NA, 28L, 57L, 
89L, 119L, 148L, 180L, 209L, 237L, 270L, 301L), Days_between = c(NA, 
28L, 29L, 32L, 30L, 29L, 32L, 29L, 28L, 33L, 31L), Dates = c("22-08-2017", 
"19-09-2017", "18-10-2017", "19-11-2017", "19-12-2017", "17-01-2018", 
"18-02-2018", "19-03-2018", "16-04-2018", "19-05-2018", "19-06-2018"
), data = c(11551714.57, 10860713.81, 10989780.35, 10578597.92, 
10343260.81, 10481946.15, 10144200.01, 10486943.26, 10701326.12, 
10530507.92, 10633318.04), u = c(NA, NA, NA, 10995202, NA, NA, 
NA, NA, NA, NA, NA), v = c(NA, NA, NA, 0L, 0L, NA, NA, NA, NA, 
NA, NA), forecast = c(1.0506142, 0.9877685, 0.9995069, 0.9621104, 
NA, NA, NA, NA, NA, NA, NA), PV = c(NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), alpha = c(0.330281472, 0.330281472, 0.330281472, 
0.330281472, 0.330281472, 0.330281472, 0.330281472, 0.330281472, 
0.330281472, 0.330281472, 0.330281472), beta = c(0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), gamma = c(0.529463573, 0.529463573, 
0.529463573, 0.529463573, 0.529463573, 0.529463573, 0.529463573, 
0.529463573, 0.529463573, 0.529463573, 0.529463573), To_be_used = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-11L))

Dput output for the output dataframe

list(par = c(0, 0, 0), value = 13759831687347294, counts = c(function = 4L, gradient = NA), convergence = 0L, message = NULL)