当回归中响应变量的分布非正态分布时使用 stan 估计参数

Estimating parameters using stan when the distribution for response variable in a regression is non-normal

我使用 R+stan 作为模型参数的 Bayesian estimates,当回归中响应变量的分布不是正态分布而是一些自定义分布时,如下所示。

假设我有以下数据生成过程

x <- rnorm(100, 0, .5)
noise <- rnorm(100,0,1)
y = exp(10 * x + noise) / (1 + exp(10 * x + noise))

data <- list( x= x, y = y, N = length(x))

stan 中,我在下面创建 stan 对象

Model = "
data {
  int<lower=0> N;
  vector[N] x;
  vector[N] y;
}
parameters {
  real alpha;
  real beta;
  real<lower=0> sigma;
}
transformed parameters {
    vector[N] mu;
    for (f in 1:N) {
        mu[f] = alpha + beta * x[f];
    }
}

model {
  sigma ~ chi_square(5);
  alpha ~ normal(0, 1);
  beta ~ normal(0, 1);
  y ~ ???;
}
"

然而,如您所见,对于 ymodel block 中正确的 stan 连续分布是什么?

任何指点将不胜感激。

感谢您的宝贵时间。

问题不是误差分布不正常(这是常规线性回归中的假设),而是 x 和 y 之间显然不是线性关系。你确实与正态分布的噪声有线性关系(z = x * 10 + noise,我在这里使用 z 以避免与你的 y 混淆),但是你应用了 softmax 函数:y = softmax(z) .如果您想使用线性回归对其进行建模,则需要反转 softmax(即从 y 返回 z),您可以使用逆 softmax(这是自softmax是反logit函数,inverse inverse logit是logit)。然后你可以做一个标准的线性回归。

model = "
data {
  int<lower=0> N;
  vector[N] x;
  vector[N] y;
}

transformed data{
  // invert the softmax function, so there's a linear relationship between x and z
  vector[N] z = logit(y);
}

parameters {
  real alpha;
  real beta;
  real<lower=0> sigma;
}

transformed parameters {
    vector[N] mu;
    // no need to loop here, this can be vectorized
    mu = alpha + beta * x;
}

model {
  sigma ~ chi_square(5);
  alpha ~ normal(0, 1);
  beta ~ normal(0, 1);
  z ~ normal(mu, sigma);
}

generated quantities {
 // now if you want to check the prediction, 
 //you predict linearly and then apply the softmax again
 vector[N] y_pred = inv_logit(alpha + beta * x);
}
"

如果你不会在模型外再次使用mu,你可以跳过转换参数块并在需要时直接计算它:

z ~ normal(alpha + beta * x, sigma);

旁注:您可能需要重新考虑您的先验知识。在这种情况下,alphabeta 的真实值分别为 0 和 10。可能性足够精确,可以在很大程度上覆盖先验,但您可能会看到 beta 向零收缩(即您可能得到 9 而不是 10)。试试 normal(0, 10) 之类的东西。而且我从未见过有人使用 chi-squared 分布作为标准偏差的先验。