【发布时间】:2018-10-17 18:38:03
【问题描述】:
我正在尝试适应营销组合模型并遇到以下问题:
警告信息: 在 KFS(模型)中: 漫反射可能的错误:Pinf中的负方差,检查>模型或尝试更改模型的公差参数tol或P1/P1inf。
以下是更详细的可重现示例代码。
目标是开发一种优化营销组合的工具 x1(t)、x2(t)、x3(t)下方是在时间t对3个营销渠道的投资 y(t) 是时间 t 的销售额
我们要使用卡尔曼滤波器方法: y(t) = alpha + lambda * y(t-1) + beta1 * x1(t) + beta2 * x2(t) + beta3 * x3(t) + beta12 * x1(t) * x2(t) + beta13 * x1(t) * x3(t) + beta23 * x2(t) * x3(t) + N(0, sigma)
为了: 一世。推断归因于每个渠道 x1(t)、x2(t)、x3(t) 的销售额 ii.它们的协同作用 x1 * x2、x1 * x3、x2 * x3 三。结转销售额 yCO(t) = y(t-1)
我们使用 KFAS 包 https://cran.r-project.org/web/packages/KFAS/index.html
下面是一个简单的可重现示例,其中我们: 1.模拟x1(t)、x2(t)、x3(t) 2.设置用于销售模拟的输入参数值 b1、b2、b12、...、b23、lambdaà 和 sigma 3.使用模拟的y(t)、x1(t)、x2(t)、x3(t)来拟合模型 4. 将估计系数与输入值 b1、b2、...进行比较
library(KFAS)
library(dplyr)
sigma<-50
set.seed(1)
x1<-1000 + rnorm(n = 100,mean = 0,sd = 100) + rnorm(100, 0, sigma)
x2<-rep(0, 100)
x2[sort(which(1:100%%6==0))]<-500
x3<-300+100*sin(1:100%%12/12*pi) + rnorm(100, 0, sigma)
#Operationalize with SQRT
x1<-sqrt(x1)
x2<-sqrt(x2)
x3<-sqrt(x3)
#Set input parameters fro simulation
lambda0<-0.5
b1 <- 3
b2 <- 4
b3 <- 5
b12 <- 0.3
b13 <- 0.2
b23 <- 0.1
y_s <-
b1 * x1 +
b2 * x2 +
b3 * x3 +
b12 * x1 * x2 +
b13 * x1 * x3 +
b23 * x2 * x3 +
rnorm(100, sd = sigma)
# function to account for carry over term
# y(t) = lambda * y(t-1) + y_s(t) , where
# y_s(t) = b1 * x1 + b2 * x2 + b3 * x3 + Synergy terms
getCarryOver<-function(t,
y_s,
lambda)
{
if (t==1) return(y_s[1])
else lambda*getCarryOver(t-1,y_s,lambda) + y_s[t]
}
# Add Carry Over term
y<-vector('numeric',100)
for (i in 1:100){
y[i]<-getCarryOver(i,y_s,lambda0)
}
yCO=dplyr::lag(y)
yCO[1]=0
if (!identical(y[-1],y_s[-1]+lambda0*yCO[-1]))
stop('identical(y,y_s+lambda0*yCO)')
model <- SSModel(y ~ SSMregression(~ x1 +
x2 +
x3 +
x1*x2 +
x1*x3 +
x2*x3 +
yCO
, Q = diag(NA,1)), H = NA)
fit <- fitSSM(model, inits = c(0,0,0,0,0,0,0,0), method = "BFGS")
model <- fit$model
model$Q
model$H
out <- KFS(model)
print(out)
【问题讨论】:
标签: r data-modeling kalman-filter