【问题标题】:Constructing a non-linear exponential model -- use a vector or real?构建非线性指数模型——使用向量还是实数?
【发布时间】:2017-01-09 18:05:31
【问题描述】:

我是 Stan 和概率编程的新手。我正在尝试构建一个非线性增长模型。我已经能够在NLS中构建模型了

我使用的 NLS 公式是:Trump_Pct ~ alpha - beta * lambda^Population

我的 NLS 总结是:

Parameters:
     Estimate Std. Error t value Pr(>|t|)    
alpha  5.627e+01  2.053e+00   27.41   <2e-16 ***
beta  3.018e+01  1.974e+00   15.29   <2e-16 ***
lambda 9.981e-01  2.486e-04 4014.47   <2e-16 ***

换句话说,一个基本的指数衰减曲线。我正在尝试使用 Stan 进行复制。

我的数据如下:

我在数据集中有N 观察结果:预测变量是一个县的人口(“人口”),预测的 Y 是对特朗普“Trump_Pct”的投票百分比。

我尝试了两种构建此模型的方法。

  1. 在其中,我将每个组件作为向量传递给模型。

  2. 另一方面,我将每个数据组件保留为一个列表并尝试使用每个数据点。

无论哪种情况,我都无法让模型成功运行。

这是我的模型:

案例一:

这是对this model的改编。

在这里,我创建了 Trump_Pct 和 Population 列的矢量化版本。

data {
    int N;
    vector[N] PopulationV;
    vector[N] Trump_PctV;
}
parameters {
    vector [1] alpha;
    vector [1] beta;
    vector [1] lambda;
    real<lower=0> sigma;
}
model {
    vector[N] ypred;
    ypred = alpha[1] - beta[1] * (lambda[1]^PopulationV);
    Trump_PctV ~ ypred + sigma;
}

由于以下原因,该模型在与指数一致时失败:

`语法错误,来自解析器的消息:

^ 的参数必须是原始的(实数或整数); block=local`中的向量不能对实数求幂

我尝试过使用pow(),但找不到前进的方向。有什么建议吗?

案例 2:

data {
  int<lower=0> N;
  real <lower=0> Population[N];
  real <lower=0> Trump_Pct[N];
}
parameters {
  real alpha;
  real beta;
  real<lower=3,upper= 4> lambda;
  real<lower=0> tau;
}
transformed parameters {
  real sigma;
  sigma = 1 / sqrt(tau);
}
model {
  real m[N];
  for (i in 1:N)
    m[i] = alpha - beta * pow(lambda, Population[i]);

  Trump_Pct ~ normal(m, sigma);

  alpha ~ normal(10, 20);
  beta ~ normal(5, 10);
  lambda ~ uniform(3, 4);
  tau ~ gamma(.0001, .0001);
}

在情况 2 中,我无法将参数估计值保持在界限内:

"Informational Message: The current Metropolis proposal is about to be rejected because of the following issue:"
[2] "Exception thrown at line 21: normal_log: Location parameter[2873] is -inf, but must be finite!"

任何人都可以为我的公式提供一个简单的非线性模型的建议吗?

【问题讨论】:

  • 没有必要将lambda ~ uniform(3, 4); 放入模型块中,因为real&lt;lower=3,upper= 4&gt; lambda; 暗示了它。也就是说,Stan 不建议使用统一的先验。 tau ~ gamma(.0001, .0001); 也可以这样说,它在很宽的正实数范围内几乎是均匀的,但在零附近具有非常尖锐的曲率。在 github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations 有 Stan 的先验建议。最后,brms 包中的brm 函数允许您以类似于nls 的方式指定模型。

标签: r rstudio bayesian stan rstan


【解决方案1】:

您的案例 2 是正确的语法。正如您所发现的,^pow 都不是输入向量,因此您必须遍历它们。

您看到的信息性消息是由于数字溢出,不应导致采样器停止。有关该消息here 的更多详细信息。

采样器可能无法启动,在这种情况下,您可以将 init_r 值传递给 stansampling 并将 init_r 设置为小于默认值 2 的值。这会影响在无约束空间中绘制初始值的均匀区间的宽度。

如果有很多溢出消息,则很可能还有其他问题,例如上述链接中也涵盖的不同转换。最终的解决方案可能涉及重新缩放数据、重新参数化模型和/或收紧先验。

【讨论】:

  • 请问为什么case 2是正确的?你说得对,我无法让采样器运行.. 会尝试你的解决方案。
  • 案例 2 是有效的语法,而案例 1 不是。所有一元函数都可以在向量输入上调用,但不能调用具有两个或多个参数的函数。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多