【问题标题】:KFAS: Negative variances and huge Std ErrorsKFAS:负方差和巨大的标准误差
【发布时间】: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


    【解决方案1】:

    这并不能完全回答您的问题,但是对于评论来说太长了......

    您创建的模型与代码之前制定的模型不同。通过定义 Q=NA,您实际上是在说明第一个系数 x1 应该随未知方差随时间变化。然后在fitSSM 调用中,您提供了太多初始值,因此您不会注意到错误(只有 Q 和 H 需要通过 fitSSM 进行数值估计,x1 等的系数由卡尔曼滤波器直接估计)。我承认这里可能很少有检查会相应地警告用户。 SSMregression函数只有当你有时变回归系数或复杂的多元模型时才需要,这里你可以写SSModel(y~ x1*x2 + x1*x3 + x2*x3 + yCO, H=NA)(主效应自动包含在lm中)。

    我还会检查结转项计算,以确保您确实正确地生成了数据。

    如果你仍然得到错误,可能是你有非常高的多重共线性,你需要修改第一个步骤的先验,即设置model$P1inf[] &lt;- 0(删除漫反射初始化)并将diag(model$P1)设置为适度的值,例如100,(系数的先验方差)。

    实际上,如果您使用您建议的公式(所有 x 和 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
    

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

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      相关资源
      最近更新 更多