KFAS:负差异和巨大的Std错误

时间:2018-05-07 21:50:35

标签: r data-modeling kalman-filter

我正在尝试使用营销组合模型并遇到以下问题:

  

警告讯息:   在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)

1 个答案:

答案 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

因此,我认为您在生成示例数据或模型公式方面存在一些问题。