Stan-缺失数据的处理

缺失数据的处理

1 missing

在统计研究中,经常遇到缺失数据。stan能够较好地对缺失数据进行处理,在data和transformed data块中声明的变量均视为已知的,而将parameters块中的视为未知。
则涉及缺失的示例编码如下:

data {
  int<lower=0> N_obs;  //可观测数量
  int<lower=0> N_mis;  //缺失数量
  real y_obs[N_obs];   //已观察的数据y_obs
}
parameters {
  real mu;            //待估计的参数
  real<lower=0> sigma;
  real y_mis[N_mis];  //未观测的(未知)
}
model {
  y_obs ~ normal(mu, sigma); //观测数据模型
  y_mis ~ normal(mu, sigma); //未观测数据模型
  //假设数据均服从正态分布
}

上述将观察到和缺失的数据点的数量分别记为N_obs和N_mis,观察到的数据为y_obs,缺失数据记为y_mis,被估计的参数为 μ \mu μ σ \sigma σ以及y_mis(缺失未知)。

2 Partially Known Parameters

在一些情况下,例如多元概率密度函数具有部分可观测的数据和参数时,创建一个关于已知(data)和未知的(parameter)的混合向量是非常有必要的。这将在stan中的transformed parameters块中表述和声明。
以下例子涉及一个二元协方差矩阵,其中方差是已知的,但是协方差是未知的:

data {
  int<lower=0> N; //样本量
  vector[2] y[N];  // ???
  real<lower=0> var1;  //方差1   
  real<lower=0> var2;  //方差2
}
//对数据进行转换——transformed data块中声明
transformed data {
  real<lower=0> max_cov = sqrt(var1 * var2); //最大协方差,确定协方差上界
  real<upper=0> min_cov = -max_cov;          //最小协方差,确定协方差下界
}
parameters {
  vector[2] mu;     
  real<lower=min_cov, upper=max_cov> cov; //协方差,确定了上界和下界
}
//对参数进行转换——transformed parameters块中声明
transformed parameters {
  matrix[2, 2] Sigma;  //协方差矩阵,2*2维的
  Sigma[1, 1] = var1;     Sigma[1, 2] = cov;
  Sigma[2, 1] = cov;      Sigma[2, 2] = var2;
}
model {
  y ~ multi_normal(mu, Sigma);//多元正态分布模型
}

其中关于协方差矩阵的声明约束条件,确保协方差矩阵为正的。向量化的形式使之处理较为效率。转换后的参数sigma可以包含在model块中的局部变量,如果其不需要在采样器的输出结果中显示的话。

sliced missing data

如果丢失的数据是某个较大数据结构的一部分,那么通常可以使用索引数组和切片对其进行有效的重新组装。下面是时间序列数据的一个示例,其中只观察到序列中的一些项。stan编译代码如下所示:

data {
  int<lower = 0> N_obs;     //可观测样本量
  int<lower = 0> N_mis;     //缺失样本量
  int<lower = 1, upper = N_obs + N_mis> ii_obs[N_obs]; //确定了上界和下界,ii_obs
  int<lower = 1, upper = N_obs + N_mis> ii_mis[N_mis];
  real y_obs[N_obs]; 
}
transformed data {
  int<lower = 0> N = N_obs + N_mis;
}
parameters {
  real y_mis[N_mis];
  real<lower=0> sigma;
}
transformed parameters {
  real y[N];
  y[ii_obs] = y_obs;
  y[ii_mis] = y_mis;
}
model {
  sigma ~ gamma(1, 1);
  y[1] ~ normal(0, 100);
  y[2:N] ~ normal(y[1:(N - 1)], sigma);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值