ฉันควรบูตที่ระดับคลัสเตอร์หรือระดับบุคคลหรือไม่


10

ฉันมีแบบจำลองการเอาชีวิตรอดกับผู้ป่วยที่ซ้อนอยู่ในโรงพยาบาลซึ่งรวมถึงผลกระทบแบบสุ่มสำหรับโรงพยาบาล เอฟเฟกต์แบบสุ่มคือการแจกแจงแกมม่าและฉันพยายามรายงาน 'ความเกี่ยวข้อง' ของคำนี้ในระดับที่เข้าใจได้ง่าย

ฉันได้พบข้อมูลอ้างอิงต่อไปนี้ซึ่งใช้อัตราส่วนค่ามัธยฐานอันตราย (bit เช่น Median Odds Ratio) และคำนวณค่านี้

Bengtsson T, Dribe M: วิธีการทางประวัติศาสตร์ 43:15, 2010

อย่างไรก็ตามตอนนี้ฉันต้องการรายงานความไม่แน่นอนที่เกี่ยวข้องกับการประเมินนี้โดยใช้ bootstrap ข้อมูลนี้เป็นข้อมูลการอยู่รอดและด้วยเหตุนี้จึงมีการสังเกตหลายครั้งต่อผู้ป่วยและผู้ป่วยหลายรายต่อโรงพยาบาล ดูเหมือนชัดเจนว่าฉันต้องจัดกลุ่มการสังเกตผู้ป่วยเมื่อทำการสุ่มตัวอย่างใหม่ แต่ฉันไม่รู้ว่าฉันควรจัดกลุ่มโรงพยาบาลด้วยหรือไม่

ฉันสงสัยว่าคำตอบนั้นขึ้นอยู่กับพารามิเตอร์ที่น่าสนใจหรือไม่และจะแตกต่างกันอย่างไรหากเป้าหมายเป็นสิ่งที่เกี่ยวข้องในระดับผู้ป่วยมากกว่าระดับโรงพยาบาล

ฉันระบุรหัส 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

คำตอบ:


2

ลองนึกภาพว่าคุณทำการศึกษาเกี่ยวกับความสำเร็จทางการศึกษาของเด็ก ๆ คุณสุ่มตัวอย่างตัวอย่างของโรงเรียนจากบางพื้นที่และจากแต่ละโรงเรียนจะมีชั้นหนึ่งรวมอยู่ในการศึกษา คุณทำการวิเคราะห์และตอนนี้ต้องการใช้ bootstrap เพื่อรับช่วงความมั่นใจสำหรับการประมาณการของคุณ ทำอย่างไร?

ก่อนอื่นให้สังเกตว่าข้อมูลของคุณเป็นแบบลำดับชั้นมีหลายระดับ ได้แก่ โรงเรียนชั้นเรียนภายในโรงเรียนและนักเรียนในชั้นเรียน เนื่องจากมีเพียงหนึ่งชั้นเรียนต่อโรงเรียนดังนั้นระดับที่สองจึงไม่มีอยู่ในข้อมูลของคุณ เราสามารถสรุปได้ว่ามีความคล้ายคลึงกันภายในโรงเรียนและความแตกต่างระหว่างโรงเรียน หากมีความคล้ายคลึงกันภายในโรงเรียนถ้าคุณสุ่มตัวอย่างนักเรียนแบบสุ่มโดยไม่คำนึงถึงความเป็นสมาชิกของโรงเรียนคุณอาจทำลายโครงสร้างแบบลำดับชั้นของข้อมูลของคุณ

โดยทั่วไปมีหลายตัวเลือก:

  1. ตัวอย่างนักเรียนที่มีการเปลี่ยน
  2. ตัวอย่างโรงเรียนทั้งที่มีการเปลี่ยน
  3. โรงเรียนตัวอย่างแห่งแรกที่มีการเปลี่ยนจากนั้นสุ่มตัวอย่างนักเรียน (a) ด้วยการเปลี่ยนหรือ (b) โดยไม่มีการแทนที่

ปรากฏว่าแนวทางแรกเป็นวิธีที่แย่ที่สุด จำได้ว่าการสุ่มตัวอย่างbootstrapอย่างใดควรเลียนแบบกระบวนการสุ่มตัวอย่างในการศึกษาของคุณและคุณเป็นโรงเรียนตัวอย่างมากกว่านักเรียนแต่ละคน การเลือกระหว่าง (2) และ (3) มีความซับซ้อนมากขึ้น แต่หวังว่าคุณจะพบงานวิจัยที่พิจารณาหัวข้อนี้ (เช่น Rena et al. 2010, Field and Welsh, 2007) โดยทั่วไปตัวเลือก (2) หรือ (3b) เป็นที่นิยมมากกว่าเนื่องจากดูเหมือนว่าการสุ่มตัวอย่างในระดับที่มากเกินไปพร้อมการทดแทนจะนำไปสู่ผลลัพธ์ที่ลำเอียง คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ในหนังสือโดย Efron และ Tibshirani (1994) และ Davison and Hinkley (1997) โปรดสังเกตว่าเรามีปัญหาที่คล้ายคลึงกันกับข้อมูลอนุกรมเวลาในการบูตข้อมูลและในกรณีนี้เรายังค่อนข้างตัวอย่างทั้งชุด (เช่นทั้งฤดูกาลถ้าเราถือว่าฤดูกาล) มากกว่าการสังเกตแต่ละคนเพราะมิฉะนั้นโครงสร้างเวลาจะถูกทำลาย ในทางปฏิบัติไม่มีวิธีแก้ปัญหาที่เหมาะกับทุกขนาด แต่ด้วยโครงสร้างข้อมูลที่ซับซ้อนคุณควรเลือกรูปแบบการสุ่มตัวอย่าง bootstrap ที่เหมาะกับข้อมูลและปัญหาของคุณมากที่สุดและถ้าเป็นไปได้ให้ใช้การศึกษาแบบจำลองเพื่อเปรียบเทียบโซลูชันที่ต่างกัน


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

ฟิลด์, CA, & Welsh, AH (2007) การบูตข้อมูลแบบคลัสเตอร์ วารสารสมาคมสถิติ: ชุด B (ระเบียบวิธีสถิติ), 69 (3), 369-390


1
ยอมรับคำตอบของคุณ (ขอบคุณ) แต่สำหรับคนอื่น ๆ ฉันได้ใช้ฟังก์ชั่นใน R เพื่อทำสิ่งนี้ในคำตอบ
drstevok

3

คำตอบน่าจะเป็นที่กระบวนการ resampling ต้องคำนึงถึงโครงสร้างของข้อมูล มีคำอธิบายที่ดีที่นี่ (พร้อมกับรหัส R เพื่อนำไปใช้)

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

ขอขอบคุณที่ชี้จากที่ยูซีแอลสถิติกลุ่มที่ปรึกษา

ฉันได้เขียนเร็ว ( แต่มีความยืดหยุ่นน้อย) รุ่นข้อมูลโค้ดที่เชื่อมโยงกับข้างต้น - เช็คที่นี่สำหรับการปรับปรุงและรายละเอียด

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)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.