构建非线性指数模型——使用向量还是实数?
Constructing a non-linear exponential model -- use a vector or real?
我是 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
个观察结果:预测变量是一个县的人口 ("Population"),预测的 Y 是特朗普的得票率 "Trump_Pct"。
我尝试了两种构建这个模型的方法。
在一个中,我将每个组件作为向量传递给模型的数据。
另一方面,我将每个数据组件保留为列表并尝试使用每个数据点。
在这两种情况下,我都无法将模型成功 运行。
这是我的模型:
案例 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;
}
此模型在指数行失败,原因如下:
`语法错误,来自解析器的消息:
^ 的参数必须是原始的(实数或整数);不能在 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:"<br>
[2] "Exception thrown at line 21: normal_log: Location parameter[2873] is -inf, but must be finite!"
任何人都可以为我的公式提供一个简单的非线性模型的建议吗?
你的情况 2 是正确的语法。正如您所发现的,^
和 pow
都不是输入向量,因此您必须遍历它们。
您看到的信息性消息是由于数值溢出,不应导致采样器停止。有关该消息的更多详细信息 here。
采样器可能无法启动,在这种情况下,您可以将 init_r
值传递给 stan
或 sampling
并将 init_r
设置为一个值小于其默认值 2。这会影响在无约束 space.
中绘制初始值的均匀区间的宽度
如果有很多溢出消息,很可能您还有其他问题,例如上述link中也涵盖的发散转换。最终的解决方案可能涉及重新缩放数据、重新参数化模型和/或收紧先验。
我是 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
个观察结果:预测变量是一个县的人口 ("Population"),预测的 Y 是特朗普的得票率 "Trump_Pct"。
我尝试了两种构建这个模型的方法。
在一个中,我将每个组件作为向量传递给模型的数据。
另一方面,我将每个数据组件保留为列表并尝试使用每个数据点。
在这两种情况下,我都无法将模型成功 运行。
这是我的模型:
案例 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;
}
此模型在指数行失败,原因如下:
`语法错误,来自解析器的消息:
^ 的参数必须是原始的(实数或整数);不能在 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:"<br>
[2] "Exception thrown at line 21: normal_log: Location parameter[2873] is -inf, but must be finite!"
任何人都可以为我的公式提供一个简单的非线性模型的建议吗?
你的情况 2 是正确的语法。正如您所发现的,^
和 pow
都不是输入向量,因此您必须遍历它们。
您看到的信息性消息是由于数值溢出,不应导致采样器停止。有关该消息的更多详细信息 here。
采样器可能无法启动,在这种情况下,您可以将 init_r
值传递给 stan
或 sampling
并将 init_r
设置为一个值小于其默认值 2。这会影响在无约束 space.
如果有很多溢出消息,很可能您还有其他问题,例如上述link中也涵盖的发散转换。最终的解决方案可能涉及重新缩放数据、重新参数化模型和/或收紧先验。