状態空間モデルのマーケティングへの応用(サンプルコード)

#######参考プログラム#######

#データの読み込み:test.csvのファイルレイアウト

#ID_W:週ID

#end:エンド陳列の有無

#logPI:点数PIの対数

#AP:売価

#RP095:参照価格(繰越パラメータ0.95:RP_t=0.95*RP_{t-1}+(1-0.95)*AP_{t-1})

#

#(注)下記プログラムでは,簡便のため定常AR成分p_tは除いている

#(注)本文中のデータとは異なっている

#

library(dlm)

Dataset <- read.table("test.csv", header=TRUE,sep=",", na.strings="NA", dec=".", strip.white=TRUE)

#フルモデル(RP095)

n<-nrow(Dataset)

y<-Dataset$logPI

E<-Dataset$end

#価格変数の加工

#実売価と参照価格の差の算定

#

z_2<-0

z_3<-0

v_wk<-Dataset$AP-Dataset$RP095

#価格変数の算定(ロス変数)

for (i in 1:n){

if (v_wk[i]>=0) {

z_2[i] <- (Dataset$AP[i]-Dataset$RP095[i])/100

} else {

z_2[i] <- 0

}

#価格変数の算定(ゲイン変数)

if (v_wk[i] < 0) {

z_3[i] <- (Dataset$RP095[i]-Dataset$AP[i])/100

} else {

z_3[i] <- 0

}

}

#

#価格変数の交互作用変数の設定

z_2E<-z_2*E

z_3E<-z_3*E

#

#デザイン行列の設定

x<-cbind(z_2,z_2E,z_3,z_3E)

#

#モデルの設定

buildModel <- function(params){

#dlmModRegには説明変数を入れる

mod1 <- dlmModReg(x, dV = exp(params[1]), dW = exp(params[2:6]))

return(mod1)

}

#最尤法

outMLE1 <- dlmMLE(y,rep(0, 6),buildModel,method = "L-BFGS-B",hessian=T,control = list(maxit = 1000000,trace=1))

#最尤法の結果

outMLE1$convergence

avar<-solve(outMLE1$hessian)

outMLE1$par

outMLE1$value

AIC<-2*outMLE1$value+2*6

AIC

exp(outMLE1$par)

sqrt(diag(avar))

#最尤推定結果に基づくフィルタリング

#

mod1 <- buildModel(outMLE1$par)

mod.filt1<-dlmFilter(y,mod1)

#固定区間平滑化

mod.smooth1 <- dlmSmooth(mod.filt1)

a1<-dropFirst(mod.smooth1$s[,1])

a2<-dropFirst(mod.smooth1$s[,2])

a3<-dropFirst(mod.smooth1$s[,3])

a4<-dropFirst(mod.smooth1$s[,4])

a5<-dropFirst(mod.smooth1$s[,5])

#平滑化のグラフ

par(mfrow=c(3,2))

plot(a1,type="l",xlab="weeks",ylab="beta_0" )

plot(a2,type="l",xlab="weeks",ylab="beta_1")

plot(a3,type="l",xlab="weeks",ylab="beta_2")

plot(a4,type="l",xlab="weeks",ylab="beta_3")

plot(a5,type="l",xlab="weeks",ylab="beta_4")