R 如何使用STAN将多级模型适配到大型数据集?

R 如何使用STAN将多级模型适配到大型数据集?,r,bayesian,stan,rstan,hierarchical-bayesian,R,Bayesian,Stan,Rstan,Hierarchical Bayesian,我正在用stan(使用rstan)建立一个多层次逻辑回归模型,以适应大数据集。我的数据集是一个2000×100100的矩阵,包含2000个个体基因组(SNP)中100100个位置的模拟测序数据。该模型的目标是评估每个SNP对0或1(健康或疾病)结果变量的影响 我想估计100100个斜率,每个SNP一个。我已经用STAN编写了以下模型,我能够将其适用于2000×101的裁剪数据集,Rhat=1,n_eff值非常高 data{ int<lower=1> N; // Rows in

我正在用stan(使用rstan)建立一个多层次逻辑回归模型,以适应大数据集。我的数据集是一个2000×100100的矩阵,包含2000个个体基因组(SNP)中100100个位置的模拟测序数据。该模型的目标是评估每个SNP对0或1(健康或疾病)结果变量的影响

我想估计100100个斜率,每个SNP一个。我已经用STAN编写了以下模型,我能够将其适用于2000×101的裁剪数据集,Rhat=1,n_eff值非常高

data{
  int<lower=1> N; // Rows
  int<lower=1> M; // Columns

  int<lower=0, upper=1> y[N]; // Outcome variable
  matrix[N, M] x; // Predictor variable
}

parameters{
  // Hyper priors
  real mu;
  real<lower=0> sigma;

  // Priors
  real a;
  vector[M] b;
}

model{
  // Hyper-priors
  mu ~ normal(0, 10);
  sigma ~ cauchy(0, 10);

  // Priors
  a ~ normal( 0 , 10 );
  b ~ normal(mu, sigma);

  // Likelihood
  y ~ bernoulli_logit(a + x * b);
}
数据{
int N;//行
int M;//列
int y[N];//结果变量
矩阵[N,M]x;//预测变量
}
参数{
//超先验
实木;
实西格玛;
//前科
真正的a;
向量[M]b;
}
模型{
//超先验
mu~normal(0,10);
sigma~cauchy(0,10);
//前科
a~正常(0,10);
b~正常(μ,σ);
//可能性
y~bernoulli_-logit(a+x*b);
}
当我尝试使用rstan函数sampling()将模型拟合到大型数据集时,R没有响应。模型的编译工作正常。你知道我做错了什么吗

R代码如下所示:

model <- stan_model("mult_predictor.stan")
fit <- sampling(model, list(N=2000, 
                            M=100100, 
                            y=y, 
                            x=x),
                iter=2000, chains=4)


model可能是您的代码工作正常,数据集太大。尝试在增加数据大小的情况下运行代码,并调查运行时和内存消耗。通过外推,你可以估计整个数据集上会发生什么。需要非常长的时间来拟合约150个或以上的参数。从文献中,我可以理解,具有10.000个参数的多层次模型并不少见,因此,应该可以在10.000个参数(可能更多)的范围内拟合一些东西。在我的模型中,每列都有一个参数——如果使用完整的数据集,则为100100个参数。是的,可以使用Stan拟合100K个参数,但模型必须对数据有意义,否则速度会非常慢。在您的情况下,由于参数比数据点多得多,您可能需要强先验。您可能需要对
b
进行非中心参数化(有关详细信息,请参阅《用户指南》)。我想听听“大手指二号”的建议,模拟越来越大的数据,看看哪里出了问题。输出大小应为100K*4K,或400M数字,每个8字节,或3.2GB内存。R是从预分配开始的,只是关于先验的另一个注释:作为基本模型,考虑从贝叶斯岭回归开始,即系数为零的中心拉普拉斯先验:<代码> b~双指数(0,sigma)< /代码>。即使你最终不使用它,也有,所以它可能是一个很好的起点。与多水平模型相比,岭回归的效用是什么?根据我对岭回归的理解,它基本上只是使用一个非常狭窄的先验(接近0)。为什么这与上面的多层次模型不同,在多层次模型中,先验知识是从数据中学习的,包括数据的宽度以及约束的程度?在岭回归的情况下,西格玛仍然是从数据中学习的,并且可能很大,允许许多值在零附近。