我应该在集群级别还是在个人级别进行引导?


10

我有一个将患者嵌套在医院中的生存模型,其中包括医院的随机效应。随机效应是伽马分布的,我试图以易于理解的规模报告该术语的“相关性”。

我发现以下使用中位数危险比(有点像中位数赔率)的参考文献进行了计算。

Bengtsson T,Dribe M:历史方法43:15,2010年

但是,现在我想使用自举报告该估计的不确定性。数据是生存数据,因此每个患者有多个观察结果,每个医院有多个患者。似乎很明显,我需要在重新采样时对患者的观察结果进行聚类。但是我不知道我是否也应该对医院进行聚类(即对医院重新采样,而不是对患者进行抽样?

我想知道答案是否取决于感兴趣的参数,如果目标是与患者有关而不是与医院有关的东西,那会有所不同吗?

如果有帮助,我在下面列出了Stata代码。

cap program drop est_mhr
program define est_mhr, rclass
stcox patient_var1 patient_var2 ///
    , shared(hospital) ///
    noshow
local twoinvtheta2 = 2 / (e(theta)^2)
local mhr = exp(sqrt(2*e(theta))*invF(`twoinvtheta2',`twoinvtheta2',0.75))
return scalar mhr = `mhr'
end

bootstrap r(mhr), reps(50) cluster(hospital): est_mhr

Answers:


2

想象一下,您进行了有关儿童教育成就的研究。您从某个地区随机抽取了一些学校样本,并且从每所学校的一个班级中纳入了研究。您进行了分析,现在想使用引导程序来获得估计的置信区间。怎么做?

首先,请注意您的数据是分层的,它具有多个级别:学校,学校内的班级和班级内的学生。由于每所学校只有一堂课,因此您的数据中没有第二级。我们可以假设学校内部存在一些相似之处,而学校之间存在差异。如果学校内部有相似之处,那么如果您随机抽样给学生,而不考虑他们的学校会员资格,则可能会破坏数据的层次结构。

通常,有几种选择:

  1. 为学生提供替换样品,
  2. 抽样更换整个学校,
  3. 首先对可以替换的学校进行抽样,然后对(a)可以替换的学生或(b)不可以替换的学生进行抽样。

似乎第一种方法是最糟糕的方法。回想一下,bootstrap抽样应该以某种方式模仿您学习中的抽样过程,而您是在抽样学校而不是个别学生。在(2)和(3)之间进行选择较为复杂,但希望您可以找到考虑该主题的研究论文(例如Rena等,2010; Field和Welsh,2007)。通常,选项(2)或(3b)是更可取的,因为似乎包含过多级别的采样和替换会导致结果有偏差。您还可以在Efron和Tibshirani(1994)和Davison和Hinkley(1997)的书中找到有关此主题的更多信息。注意,我们在引导时间序列数据时也遇到类似的问题在这种情况下,我们也希望对整个系列进行抽样(例如,如果假设为季节性,则为整个季节),而不是对单个观测值进行抽样,因为否则时间结构将被破坏。实际上,没有万能的解决方案,但是对于复杂的数据结构,您应该选择最适合您的数据和问题的引导抽样方案,并在可能的情况下使用仿真研究比较不同的解决方案。


Davison,AC和Hinkley,DV(1997)。Bootstrap方法及其应用。剑桥。

Efron,B.和Tibshirani,RJ(1994)。Bootstrap简介。CRC出版社。

Ren,S.,Lai,H.,Tong,W.,Aminzadeh,M.,Hou,X.,&Lai,S.(2010)。分层数据的非参数引导。应用统计杂志,37(9),1487-1498。

Field,CA,&Welsh,AH(2007)。引导群集数据。皇家统计学会杂志:B系列(统计方法),69(3),369-390。


1
接受了您的答案(谢谢),但是对于其他人,我现在已经在R中实现了一个功能,可以在我的答案中
drstevok 2015年

3

答案似乎是重新采样过程需要考虑数据的结构。这里有一个很好的解释(以及一些实现此目的的R代码)。

http://biostat.mc.vanderbilt.edu/wiki/Main/HowToBootstrapCorrelatedData

感谢UCLA统计咨询小组的指导

我已经写了一个更快(但不太灵活)的链接到上面的代码片段-请在此处查看更新和详细信息。

rsample2 <- function(data=tdt, id.unit=id.u, id.cluster=id.c) {
require(data.table)

setkeyv(tdt,id.cluster)
# Generate within cluster ID (needed for the sample command)
tdt[, "id.within" := .SD[,.I], by=id.cluster, with=FALSE]

# Random sample of sites
bdt <- data.table(sample(unique(tdt[[id.cluster]]), replace=TRUE))
setnames(bdt,"V1",id.cluster)
setkeyv(bdt,id.cluster)

# Use random sample of sites to select from original data
# then
# within each site sample with replacement using the within site ID
bdt <- tdt[bdt, .SD[sample(.SD$id.within, replace=TRUE)],by=.EACHI]

# return data sampled with replacement respecting clusters
bdt[, id.within := NULL] # drop id.within
return(bdt)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.