使用时间序列横截面数据的两级层次模型?

机器算法验证 多层次分析 分层贝叶斯
2022-04-16 20:00:02

一个对分层建模相当陌生的人提出的问题,我正在寻找 R 中的最佳方法,最好使用包 lme4、MCMCpack 或 rjags 使用 BUGS 文档。我不确定最好的方法,所以我想要一些指导。

我有兴趣创建一个两级层次模型,其中包含横截面、时间序列的数据,并且在个人级别与来自组级别的数据合并。让我解释一下合并的两个数据集:

组级数据集显示了 100 个不同县的值班警察数量。该数据收集了 10 次不同的时间,因此有 10 组 100 个县。我将此组级县级数据与个人级人口统计和犯罪数据(按个人县级合并)合并。

个人层面的数据还为每个人提供了一个指标(1 或 0),表明他们在此期间是否报告了犯罪行为。这个个人层面的数据也是在 10 个时间点收集的——因此它与群体层面的数据相匹配——但它是横截面数据,而不是面板数据(每个时期不同的人)。这是我的因变量,所以我正在寻找一种 logit 或 probit 方法。

基本上,我想创建一个具有两个级别的层次模型:县和时间,其中周期变量 (1-10) 嵌套在县 (1-100) 中。这看起来相当简单——一个两级嵌套模型——但到目前为止我的方法都失败了。

根据同事推荐的一本书(Gelman and Hill),感觉对BUGS和lme4中的基本层次模型编程有一定的理解,但是书中没有详细介绍嵌套等更复杂的模型,和其他参考资料没有用。

下面是我的数据在 R 中的样子的截断示例。非常感谢任何建议、关于要使用的包的建议以及用于建模的示例代码!

counties <- c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3) #only 3 counties for explanation purposes
police <- c(1,22,4,56,3,32,12,8,43,5,45,34,33,21,62,22,3,12,19,29,11,8,32,33,18,12,12) #number of police per county
personID  <- seq(1,27) # only 27 people for explanation purposes
period <- c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3) #only 3 periods for explanation purposes
age <- c(45,55,23,67,21,34,39,48,52,45,32,71,55,56,19,34,48,56,77,33,22,21,44,64,51,55,60) #an individual level predictor not in the hierarchy
crime <- c(1,1,0,0,1,1,0,0,1,0,0,1,1,0,1,0,0,1,1,0,0,0,0,1,0,1,0) #Dependent Var: Did individual report a crime? Yes/No

sample <- matrix(c(personID, period, age, crime, counties, police), nrow=27, ncol=6)
colnames(sample) <- c("personID", "period", "age", "crime", "counties", "police")

> sample
      personID period age crime counties police
 [1,]        1      1  45     1        1      1
 [2,]        2      1  55     1        1     22
 [3,]        3      1  23     0        1      4
 [4,]        4      2  67     0        1     56
 [5,]        5      2  21     1        1      3
 [6,]        6      2  34     1        1     32
 [7,]        7      3  39     0        1     12
 [8,]        8      3  48     0        1      8
 [9,]        9      3  52     1        1     43
[10,]       10      1  45     0        2      5
[11,]       11      1  32     0        2     45
[12,]       12      1  71     1        2     34
[13,]       13      2  55     1        2     33
[14,]       14      2  56     0        2     21
[15,]       15      2  19     1        2     62
[16,]       16      3  34     0        2     22
[17,]       17      3  48     0        2      3
[18,]       18      3  56     1        2     12
[19,]       19      1  77     1        3     19
[20,]       20      1  33     0        3     29
[21,]       21      1  22     0        3     11
[22,]       22      2  21     0        3      8
[23,]       23      2  44     0        3     32
[24,]       24      2  64     1        3     33
[25,]       25      3  51     0        3     18
[26,]       26      3  55     1        3     12
[27,]       27      3  60     0        3     12
1个回答

我不是 100% 确定,所以请仔细检查,您可能希望将先验放在方差上而不是 1.0E-12 上,但也许是这样的?

model {
  for( i in 1 : nData ) {
    crime[i] ~ dbern( mu[i] )
    logit(mu[i]) <- base + b0[counties[i], period[i]] + b1[counties[i], period[i]] * police[i]
  }
  base ~ dnorm( 0 , 1.0E-12)

  for (j in 1 : nCounties){
    for (k in 1 : nPeriod) {
      b0[j, k] ~ dnorm(b0h[j], 1.0E-12)
      b1[j, k] ~ dnorm(b1h[j], 1.0E-12)
    }
  }  

  for ( j in 1 : nCounties ) {
    b0h[j] ~ dnorm( 0 , 1.0E-12 )
    b1h[j] ~ dnorm( 0 , 1.0E-12 )
  }
}