如何表示分类预测器rstan?

时间:2015-03-21 13:59:40

标签: r dataframe stan rstan

格式化在STAN中使用的分类预测变量的正确方法是什么?我似乎无法将分类预测器输入为正常因子变量,那么转换正常分类变量以便STAN可以接受它的最快方法是什么?

例如,假设我有一个继续预测器和类似的分类预测器:

     income      country
1  62085.59      England
2  60806.33      England
3  60527.27      England
4  67112.64          USA
5  57675.92          USA
6  58128.44          USA
7  60822.47 South Africa
8  55805.80 South Africa
9  63982.99 South Africa
10 64555.45      Belgium

我如何准备将其输入rstan?

2 个答案:

答案 0 :(得分:17)

Stan只输入实数或整数变量是正确的。在这种情况下,您希望将分类预测变换为虚拟变量(可能不包括参考类别)。在R中,您可以执行类似

的操作
dummy_variables <- model.matrix(~ country, data = your_dataset)

但是,如果您对某些其他变量进行了未建模的缺失,则可能无法获得正确数量的观察结果。通过输入像

这样的整个模型公式,可以更进一步地采用这种方法
X <- model.matrix(outcome ~ predictor1 + predictor2 ..., data = your_dataset)

现在,您有一个完整的预测变量设计矩阵,您可以在具有线性代数的.stan程序中使用,例如

data {
  int<lower=1> N;
  int<lower=1> K;
  matrix[N,K]  X;
  vector[N]    y;
}
parameters {
  vector[K] beta;
  real<lower=0> sigma;
}
model {
  y ~ normal(X * beta, sigma); // likelihood
  // priors
}

建议使用设计矩阵,因为它使.stan程序可以使用相同模型的不同变体甚至不同的数据集重复使用。

答案 1 :(得分:3)

另一种方法是使用索引变量,在这种情况下,Stan程序看起来像

data {
  int<lower = 1> N; // observations
  int<lower = 1> J; // levels
  int<lower = 1, upper = J> x[N];
  vector[N] y;      // outcomes
}
parameters {
  vector[J] beta;
  real<lower = 0> sigma;
}
model {
  y ~ normal(beta[x], sigma); // likelihood
  // priors 
}

您将像这样将数据从R传递到Stan

list(N = nrow(my_dataset),
     J = nlevels(my_dataset$x),
     x = as.integer(my_dataset$x),
     y = my_dataset$y)