构造一个非线性指数模型 - 使用向量还是实数?

时间:2017-01-09 18:05:31

标签: r rstudio bayesian stan rstan

我是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 ***

换句话说,一个基本的指数衰减曲线。我试图与斯坦一起复制。

我的数据如下:

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

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

  1. 在一个方面,我将每个组件作为向量传递给模型的数据。

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

  3. 我无法在任何一种情况下都能让模型成功运行。

    以下是我的模特:

    案例1:

    这是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;
    }
    

    由于以下原因,此模型在带指数的行上失败:

    `SYNTAX错误,来自PARSER的消息:

    ^的参数必须是原始的(real或int);无法用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!"

    有人可以为我的公式提供简单非线性模型的建议吗?

1 个答案:

答案 0 :(得分:1)

您的案例2是正确的语法。正如您所发现的那样,^pow都没有输入向量,因此您必须循环它们。

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

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

如果有很多溢出消息,很可能还有其他问题,例如上面链接中也包含的发散转换。最终解决方案可能涉及重新调整数据,重新参数化模型和/或收紧先验。