ความสับสนระหว่างโพรซีเดอร์บู๊ตสแตรปกับโพรซีเดอร์มอนติคาร์โลนั้นเกิดขึ้นซ้ำ ๆ ดังนั้นนี่อาจเป็นสถานที่ที่ดีพอที่จะกล่าวถึง (ตัวอย่างของR
รหัสอาจช่วยทำการบ้านด้วย)
พิจารณาการติดตั้ง bootstrap ในR
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
การดูอย่างรวดเร็วจะยืนยันว่านี่เป็นการคำนวณที่กำหนดขึ้นมา : ไม่มีการสร้างหรือใช้ค่าสุ่ม (ฉันจะปล่อยให้รายละเอียดของการทำงานภายในของมันสำหรับผู้อ่านที่สนใจจะคิดออกเอง)
อาร์กิวเมนต์ที่boot
ใช้เป็นชุดของข้อมูลตัวเลขในอาเรย์x
และการอ้างอิงt
ไปยังฟังก์ชัน (ซึ่งสามารถนำไปใช้กับอาร์เรย์ที่เหมือนกันx
) เพื่อส่งคืนค่าตัวเลขเดียว ในคำอื่น ๆ ที่t
เป็นสถิติ มันสร้างตัวอย่างที่เป็นไปได้ทั้งหมดด้วยการแทนที่จากx
และนำt
ไปใช้กับแต่ละรายการดังนั้นจึงสร้างหมายเลขหนึ่งสำหรับตัวอย่างแต่ละตัวอย่าง: นั่นคือ bootstrap โดยย่อ ค่าตอบแทนเป็นอาร์เรย์ที่เป็นตัวแทนของการกระจายบูตที่แน่นอนของสำหรับตัวอย่างt
x
เป็นตัวอย่างเล็ก ๆลอง bootstrap ค่าเฉลี่ยสำหรับตัวอย่างx
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
มีตัวอย่างที่เป็นไปได้ของขนาดมีอยู่สี่ตัวที่สามารถแทนที่ได้จาก ; คือ , ,และ(3,3) สร้างพวกเขาทั้งหมด (ตามลำดับที่แสดงรายการไว้) และนำไปใช้กับแต่ละรายการ ในกรณีนี้คำนวณค่าเฉลี่ยและค่าที่ได้คือ , ,และตามลำดับดังแสดงในเอาต์พุต( 1 , 3 ) ( 1 , 1 ) ( 1 , 3 ) ( 3 , 1 ) ( 3 , 3 ) 1 2 2 32( 1 , 3 )( 1 , 1 )( 1 , 3 )( 3 , 1 )(3,3)boot
t
t
1223
ที่ที่คุณไปจากที่นี่ขึ้นอยู่กับวิธีที่คุณต้องการใช้ bootstrap เต็มข้อมูลเกี่ยวกับการบูตที่มีอยู่ในอาร์เรย์การส่งออกนี้จึงมักจะเป็นความคิดที่ดีที่จะแสดง นี่คือตัวอย่างที่ค่าเบี่ยงเบนมาตรฐานถูก bootstrapped จากตัวอย่าง :(1,3,3,4,7)
hist(boot(c(1,3,3,4,7), sd))
ตอนนี้เราพร้อมที่จะพูดคุยเกี่ยวกับการจำลอง Monte Carlo สมมติว่าเราจะเริ่มต้นขีด จำกัด ความเชื่อมั่นสูงสุด 95% ใน SD จากตัวอย่างโดยใช้เปอร์เซ็นต์ไทล์ 95 บนของการกระจายบูทสแตรปของมัน ขั้นตอนนี้จะมีคุณสมบัติใด วิธีหนึ่งในการค้นหาคือสมมติว่ากลุ่มตัวอย่างได้มาจากการสุ่มการกระจายตัวแบบสม่ำเสมอ (แอปพลิเคชันมักจะระบุว่าสมมติฐานการกระจายสินค้าที่สมเหตุสมผลอาจเป็นอย่างไรที่นี่ฉันเลือกโดยพลการที่ง่ายสำหรับการคำนวณ แต่ไม่ใช่เรื่องง่ายที่จะจัดการกับการวิเคราะห์) เราสามารถจำลองสิ่งที่เกิดขึ้นโดยการใช้ตัวอย่างและคำนวณ UCL:5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
ผลสำหรับ The นี้ตัวอย่างโดยเฉพาะอย่างยิ่งสุ่ม 3.83587 นี้เป็นที่ชัดเจน: คุณกำลังจะเรียกboot
อีกครั้งกับเดียวกันชุดของข้อมูล, คำตอบจะตรงเดียวกัน แต่คำตอบอาจเปลี่ยนไปอย่างไรกับกลุ่มตัวอย่างที่แตกต่างกัน? ค้นหาโดยทำซ้ำกระบวนการนี้สองสามครั้งแล้ววาดฮิสโตแกรมของผลลัพธ์:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
ถ้าเราทำแบบจำลองอีกชุดการสุ่มจับจะออกมาแตกต่างกันสร้างฮิสโตแกรมต่าง ๆ (เล็กน้อย) - แต่ไม่แตกต่างจากอันนี้มาก เราสามารถใช้ด้วยความมั่นใจเพื่อทำความเข้าใจว่า bootstrap UCL ของ SD ทำงานอย่างไร สำหรับการอ้างอิงแจ้งให้ทราบว่าเบี่ยงเบนมาตรฐานของเครื่องแบบกระจาย (ทอดช่วงตั้งแต่ที่จะตามที่ระบุไว้ที่นี่) เท่ากับ2.887 ในฐานะที่เป็นหนึ่งหวังว่า UCL ใด ๆ ที่มีมูลค่าเกลือส่วนใหญ่ (สามในสี่หรือ 0.75) ของค่าในฮิสโตแกรมเกินค่านี้:10 10 / √01010/12−−√≈2.887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
แต่ไม่มีที่ไหนใกล้ 95% ที่เราระบุ (และหวังว่าจะได้)! นี่คือค่าหนึ่งของการจำลอง: เปรียบเทียบความหวังของเรากับสิ่งที่เกิดขึ้นจริง (ทำไมความแตกต่างฉันเชื่อว่ามันเป็นเพราะ bootstrapping SD ไม่ทำงานได้ดีกับตัวอย่างขนาดเล็กจริงๆ)
ทบทวน
สถิติ Bootstrap นั้นมีแนวคิดเหมือนกับสถิติอื่น ๆ เช่นค่าเฉลี่ยหรือส่วนเบี่ยงเบนมาตรฐาน พวกเขามักจะใช้เวลานานในการคำนวณ (ดูข้อความเตือนในboot
รหัส!)
การจำลองแบบมอนติคาร์โลนั้นมีประโยชน์สำหรับการศึกษาว่าสถิติการบูตสต็อปแตกต่างกันอย่างไรเนื่องจากการสุ่มในการรับตัวอย่าง ความผันแปรที่สังเกตได้ในการจำลองนั้นเกิดจากการเปลี่ยนแปลงในตัวอย่างไม่ใช่การเปลี่ยนแปลงใน bootstrap
(ไม่ได้แสดงไว้ที่นี่) เนื่องจากสถิติ bootstrap สามารถใช้การคำนวณจำนวนมาก (เห็นได้ชัดว่ามีการคำนวณสูงสุดสำหรับตัวอย่างขนาด ) จึงสะดวกในการประมาณการกระจาย bootstrap สิ่งนี้มักจะทำโดยการสร้างโปรแกรม "กล่องดำ" เพื่อรับค่าหนึ่งค่าโดยการสุ่มจากการกระจาย bootstrap ที่แท้จริงและเรียกโปรแกรมนั้นซ้ำ ๆ เอาต์พุตแบบรวมประมาณการกระจายที่แน่นอน การประมาณสามารถเปลี่ยนแปลงได้เนื่องจากการสุ่มในกล่องดำ - แต่การเปลี่ยนแปลงนั้นเป็นสิ่งประดิษฐ์ของขั้นตอนการประมาณ มันไม่ได้ (โดยทางความคิด) โดยธรรมชาติในขั้นตอนการบูตตัวเอง nnnn