我正在尝试使用营销组合模型并遇到以下问题:
警告讯息: 在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 III。结转销售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)
答案 0 :(得分:0)
这并不能完全回答你的问题,但这个评论太长了......
您没有创建在代码之前制定的相同模型。通过定义Q = NA,您实际上声明第一个系数x1应该是时变的,方差未知。然后在fitSSM
调用中,您给出了太多的初始值,因此您没有注意到错误(只有Q和H需要通过fitSSM进行数值估计,x1等的系数通过卡尔曼滤波器直接估算) 。我承认这里可能缺少一些检查,因此会警告用户。只有当你有时变回归系数或复杂的多变量模型时才需要SSMregression
函数,在这里你可以写SSModel(y~ x1*x2 + x1*x3 + x2*x3 + yCO, H=NA)
(主效应自动包括在lm
中)。
我还会检查结转期限计算,以确保您确实正确生成数据。
如果你仍然遇到错误,那么你可能需要修改先前第一步的高多重共线性,即设置model$P1inf[] <- 0
(删除漫反射初始化)并设置diag(model$P1)
温和的东西,如100,(系数的先验方差)。
实际上,如果您使用的是您建议的配方(所有x&s和yC0都是简单的解释变量),那么您应该使用lm
获得相同的结果。使用lm
运行您的代码我得到了相同的错误结果:
> model <- SSModel(y~ x1*x2 + x1*x3 + x2*x3 + yCO, H=NA)
>
> fit <- fitSSM(model, inits = 0, method = "BFGS")
> out <- KFS(fit$model)
Warning message:
In KFS(fit$model) :
Possible error in diffuse filtering: Negative variances in Pinf, check the model or try changing the tolerance parameter tol or P1/P1inf of the model.
> out
Smoothed values of states and standard errors at time n = 100:
Estimate Std. Error
(Intercept) -1.171e+03 1.300e+03
x1 3.782e+01 4.102e+01
x2 -4.395e+00 1.235e+01
x3 7.287e+01 6.844e+01
yCO 5.244e-01 3.396e-02
x1:x2 5.215e-01 3.979e-01
x1:x3 -1.853e+00 2.167e+00
x2:x3 1.671e-01 3.471e-01
> summary(lm(y~ x1*x2 + x1*x3 + x2*x3 + yCO))
Call:
lm(formula = y ~ x1 * x2 + x1 * x3 + x2 * x3 + yCO)
Residuals:
Min 1Q Median 3Q Max
-137.297 -29.870 -2.214 35.178 87.578
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.171e+03 1.300e+03 -0.901 0.370
x1 3.782e+01 4.102e+01 0.922 0.359
x2 -4.395e+00 1.235e+01 -0.356 0.723
x3 7.287e+01 6.844e+01 1.065 0.290
yCO 5.244e-01 3.396e-02 15.445 <2e-16 ***
x1:x2 5.215e-01 3.979e-01 1.311 0.193
x1:x3 -1.853e+00 2.167e+00 -0.855 0.395
x2:x3 1.671e-01 3.471e-01 0.481 0.631
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 50.25 on 92 degrees of freedom
Multiple R-squared: 0.88, Adjusted R-squared: 0.8709
F-statistic: 96.43 on 7 and 92 DF, p-value: < 2.2e-16
因此,我认为您在生成示例数据或模型公式方面存在一些问题。