การจำลองการวิเคราะห์กำลังถดถอยของโลจิสติกส์ - การทดลองที่ออกแบบมา


39

คำถามนี้เป็นคำถามในการตอบสนองต่อคำตอบที่ได้รับจาก @ Greg หิมะในเรื่องที่เกี่ยวกับคำถามที่Proc GLMPOWERผมถามเกี่ยวกับการวิเคราะห์การใช้พลังงานที่มีการถดถอยโลจิสติกและเอสเอ

ถ้าฉันออกแบบการทดลองและวิเคราะห์ผลลัพธ์ในการถดถอยแบบลอจิสติกแบบแฟคทอเรียลฉันจะใช้การจำลอง (และที่นี่ ) เพื่อทำการวิเคราะห์พลังงานได้อย่างไร

นี่คือตัวอย่างง่ายๆที่มีตัวแปรสองตัวตัวแรกใช้กับค่าที่เป็นไปได้สามค่าคือ {0.03, 0.06, 0.09} และตัวที่สองคือตัวบ่งชี้จำลอง {0,1} สำหรับแต่ละครั้งเราประเมินอัตราการตอบกลับสำหรับแต่ละชุดค่าผสม (จำนวนผู้ตอบ / จำนวนผู้ที่ทำการตลาด) นอกจากนี้เราต้องการให้มีการรวมกันครั้งแรกหลายเท่าของปัจจัยอื่น ๆ (ซึ่งถือได้ว่ามีค่าเท่ากัน) เนื่องจากชุดค่าผสมครั้งแรกนี้เป็นรุ่นทดลองและจริงของเรา นี่คือการตั้งค่าที่กำหนดไว้ในหลักสูตร SAS ที่กล่าวถึงในคำถามที่เชื่อมโยง

ป้อนคำอธิบายรูปภาพที่นี่

รูปแบบที่จะใช้ในการวิเคราะห์ผลลัพธ์จะเป็นการถดถอยโลจิสติกโดยมีเอฟเฟกต์หลักและการโต้ตอบ (การตอบสนองคือ 0 หรือ 1)

mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))

ฉันจะจำลองชุดข้อมูลที่ใช้กับรุ่นนี้เพื่อทำการวิเคราะห์พลังงานได้อย่างไร

เมื่อฉันรันสิ่งนี้ผ่าน SAS Proc GLMPOWER(การใช้STDDEV =0.05486016 ซึ่งสอดคล้องกับsqrt(p(1-p))ตำแหน่ง p คือค่าเฉลี่ยถ่วงน้ำหนักของอัตราการตอบกลับที่แสดง):

data exemplar;
  input Var1 $ Var2 $ response weight;
  datalines;
    3 0 0.0025  3
    3 1 0.00395 1
    6 0 0.003   1
    6 1 0.0042  1
    9 0 0.0035  1
    9 1 0.002   1;
run;

proc glmpower data=exemplar;
  weight weight;
  class Var1 Var2;
  model response = Var1 | Var2;
  power
    power=0.8
    ntotal=.
    stddev=0.05486016;
run;

หมายเหตุ: GLMPOWERจะใช้ตัวแปร class (เล็กน้อย) เท่านั้นดังนั้น 3, 6, 9 ข้างต้นจะถือว่าเป็นอักขระและอาจมีค่าต่ำกลางและสูงหรือสามสตริงอื่น ๆ เมื่อดำเนินการวิเคราะห์จริง Var1 จะใช้ตัวเลข (และเราจะรวมคำพหุนาม Var1 * Var1) เพื่ออธิบายความโค้งใด ๆ

ผลลัพธ์จาก SAS คือ

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นเราเห็นว่าเราต้องการ 762,112 เนื่องจากขนาดตัวอย่างของเรา (เอฟเฟ็กต์หลัก Var2 ยากที่สุดในการประมาณค่า) โดยมีกำลังเท่ากับ 0.80 และอัลฟาเท่ากับ 0.05 เราจะจัดสรรสิ่งเหล่านี้เพื่อให้ 3 ครั้งมากที่สุดคือชุดค่าผสมพื้นฐาน (เช่น 0.375 * 762112) และส่วนที่เหลือก็ตกอยู่ในชุดค่าผสมอื่น ๆ อีก 5 ค่าเท่ากัน


นี่เป็นเรื่องง่ายที่จะทำในคำถามที่ 1 ของอาร์: ฉันถูกต้องหรือไม่ที่คุณต้องการให้ 75% ของทุกกรณีเป็น {var1 = .03, var2 = 0} & 25% สำหรับคอมโบอื่น ๆ ทั้งหมดไม่ใช่ 3 ยูนิตต่อ 1 หน่วยในคอมโบอื่น ๆ (เช่น 37.5%) คำถามที่สองคุณสามารถระบุเอฟเฟกต์ที่คุณสนใจในการตรวจจับได้หรือไม่? คืออัตราต่อรองของ 1 เทียบกับ 0 คืออะไร อัตราต่อรองของความสำเร็จควรเปลี่ยนแปลงอย่างไรถ้า var1 เพิ่มขึ้นด้วย. 01 คุณคิดว่าอาจจะมีการโต้ตอบกัน (ถ้าเป็นเช่นนั้นมันมีขนาดใหญ่แค่ไหน)? (NB, คำถามเหล่านี้ตอบยาก, 1 กลยุทธ์คือการระบุสัดส่วนของ 1 คุณคิดว่าอาจจะอยู่ในแต่ละคำสั่งผสม)
gung - Reinstate Monica

ที่ 1: น้ำหนัก 3 สำหรับกรณีพื้นฐานคือมีหลายครั้งที่ {var1 = 0.03, var2 = 0} ดังนั้นผลลัพธ์จาก SAS (ซึ่งบอกว่าเราต้องการขนาดตัวอย่างทั้งหมด 762,112 อันเพื่อให้มีพลัง 80% ในการปฏิเสธเอฟเฟกต์หลัก var2 = 0 ดังนั้นนั่นคือขนาดตัวอย่างทั้งหมดที่เราต้องการ) จะได้รับการจัดสรร 37.5% สำหรับกรณีพื้นฐานนี้
B_Miner

2nd: ทั้งหมดที่เรามีคืออัตราการตอบสนอง (ซึ่งเป็นอัตราส่วนที่คาดหวังของจำนวนความสำเร็จมากกว่าจำนวนการทดลอง) ดังนั้นถ้าเราส่ง 1,000 ตัวอักษรด้วย Var1 = 0.03 และ Var2 = 0 ซึ่งสามารถสอดคล้องกับข้อเสนออัตราดอกเบี้ยในข้อเสนอจดหมายตรงบัตรเครดิต 0.03 (3%) และไม่มีสติกเกอร์บนซองจดหมาย (ที่ Var2 = 1 หมายความว่ามี สติกเกอร์) เราคาดว่า 1,000 * 0.0025 คำตอบ
B_Miner

ข้อที่ 2: เราคาดหวังว่าจะได้รับการตอบสนอง - ด้วยเหตุนี้อัตราการตอบกลับ โปรดทราบว่าอัตราการตอบกลับต่างกันสำหรับ Var2 = 0 ขึ้นอยู่กับค่าของ Var1 ฉันไม่แน่ใจว่าจะแปลสิ่งเหล่านี้เพื่อบันทึกราคาและชุดข้อมูลจำลองได้อย่างไร
B_Miner

สิ่งสุดท้ายที่แม้ว่า ฉันสังเกตเห็นว่าอัตราการตอบสนองเป็นแบบเชิงเส้นสำหรับ var1 เมื่อ var2 = 0 (เช่น .25%, .30%, .35%) คุณตั้งใจจะให้สิ่งนี้เป็นผลเชิงเส้นหรือเส้นโค้งหรือไม่? คุณควรรู้ว่าความน่าจะเป็นอาจเป็นเชิงเส้นตรงสำหรับเซตย่อยเล็ก ๆ ของช่วง แต่ก็ไม่สามารถเป็นเชิงเส้นได้ การถดถอยแบบลอจิสติกเป็นแบบเชิงเส้นในอัตราต่อรองไม่ใช่ความน่าจะเป็น (ฉันอภิปรายสิ่งต่าง ๆ เช่นนั้นในคำตอบของฉันที่นี่ )
gung - Reinstate Monica

คำตอบ:


43

รอบคัดเลือกโซน:

  • ตามที่กล่าวไว้ในคู่มือพลังงาน G *มีการวิเคราะห์พลังงานหลายประเภทขึ้นอยู่กับสิ่งที่คุณต้องการแก้ไข (นั่นคือขนาดของเอฟเฟ็กต์ ,และพลังงานที่มีอยู่สัมพันธ์กัน; การระบุสามตัวใด ๆ จะช่วยให้คุณแก้ปัญหาได้ครั้งที่สี่) E S αNESα

    • ในคำอธิบายของคุณคุณต้องการทราบที่เหมาะสมเพื่อจับภาพอัตราการตอบกลับที่คุณระบุด้วยและ power = 80% นี่คือพลังพิเศษ α = .05Nα=.05
    • เราสามารถเริ่มต้นด้วยพลังงาน post-hoc (กำหนดพลังงานที่กำหนด , อัตราการตอบสนอง & อัลฟา) เนื่องจากนี่คือแนวคิดที่ง่ายขึ้นแล้วเลื่อนขึ้นN
  • นอกเหนือไปจาก @ GregSnow ของโพสต์ที่ยอดเยี่ยมอีกคำแนะนำที่ดีมากที่จะได้อำนาจจำลองที่ใช้วิเคราะห์ใน CV สามารถพบได้ที่นี่: การคำนวณพลังงานทางสถิติ เพื่อสรุปแนวคิดพื้นฐาน:

    1. ค้นหาเอฟเฟกต์ที่คุณต้องการตรวจจับ
    2. สร้างข้อมูล N จากโลกที่เป็นไปได้
    3. เรียกใช้การวิเคราะห์ที่คุณตั้งใจจะดำเนินการมากกว่าข้อมูลมารยาทเหล่านั้น
    4. เก็บว่าผลลัพธ์นั้นมีนัยสำคัญหรือไม่ตามอัลฟาที่คุณเลือก
    5. ทำซ้ำหลายครั้ง( ) ครั้งและใช้% 'สำคัญ' เป็นค่าประมาณของพลังงาน (โพสต์เฉพาะกิจ) ที่NBN
    6. เพื่อหาค่ากำลังไฟฟ้าเบื้องต้นให้ค้นหาเป็นไปได้เพื่อหาค่าที่ให้กำลังงานที่คุณต้องการ N
  • ไม่ว่าคุณจะพบความสำคัญในการทำซ้ำโดยเฉพาะอย่างยิ่งสามารถเข้าใจได้เป็นผลของการทดลอง Bernoulli ด้วยความน่าจะเป็น (โดยที่คือพลัง) สัดส่วนที่พบในการวนซ้ำทำให้เราสามารถประมาณค่าจริงได้ เพื่อให้ได้ค่าประมาณที่ดีกว่าเราสามารถเพิ่มถึงแม้ว่าสิ่งนี้จะทำให้การจำลองใช้เวลานานขึ้น p B p BppBpB

  • ใน R วิธีหลักในการสร้างข้อมูลไบนารี่ที่มีความน่าจะเป็นของ 'ความสำเร็จ' คือ? rbinom

    • เช่นเพื่อรับจำนวนความสำเร็จจากการทดลอง 10 Bernoulli ด้วยความน่าจะเป็น p รหัสจะเป็นrbinom(n=10, size=1, prob=p)(คุณอาจต้องการกำหนดผลลัพธ์ให้กับตัวแปรสำหรับการจัดเก็บ)
    • คุณยังสามารถสร้างข้อมูลดังกล่าวได้อย่างสวยงามน้อยลงโดยใช้? runifเช่นifelse(runif(1)<=p, 1, 0)
    • หากคุณเชื่อว่าผลลัพธ์นั้นเป็นสื่อกลางโดยตัวแปร Gaussian ที่ซ่อนเร้นคุณสามารถสร้างตัวแปรแฝงเป็นฟังก์ชันของ covariates ของคุณด้วย? rnormแล้วแปลงเป็นความน่าจะเป็นด้วยpnorm()และใช้สิ่งเหล่านั้นในrbinom()รหัส ของคุณ
  • คุณระบุว่าคุณจะ "รวมคำพหุนามช่วง Var1 * Var1) เพื่ออธิบายความโค้งใด ๆ " มีความสับสนอยู่ที่นี่; คำพหุนามสามารถช่วยเราคิดเรื่องความโค้ง แต่นี่เป็นคำที่ใช้พูดกัน - มันจะไม่ช่วยเราด้วยวิธีนี้ อย่างไรก็ตามอัตราการตอบกลับของคุณกำหนดให้เราต้องรวมทั้งคำที่ยกกำลังสองและคำที่ใช้โต้ตอบในโมเดลของเรา โมเดลของคุณจะต้องมี: ,และเกินข้อกำหนดพื้นฐาน v a r 1 v a r 2 v a r 1 2v a r 2var12var1var2var12var2

  • แม้ว่าเขียนในบริบทของคำถามที่แตกต่างกันคำตอบของฉันที่นี่: ความแตกต่างระหว่างรุ่น logit และ probitมีข้อมูลพื้นฐานมากมายเกี่ยวกับแบบจำลองประเภทนี้
  • เช่นเดียวกับที่มีชนิดที่แตกต่างกันของความคลาดเคลื่อนประเภทที่เมื่อมีหลายสมมติฐาน (เช่นอัตราความผิดพลาดต่อความคมชัด , อัตราความผิดพลาด familywiseและอัตราความผิดพลาดต่อครอบครัว ) ดังนั้นจะมีชนิดที่แตกต่างกันของการใช้พลังงาน * (เช่นเอฟเฟกต์ที่ระบุไว้ล่วงหน้าเดียวสำหรับเอฟเฟกต์ใด ๆ & สำหรับเอฟเฟกต์ทั้งหมด ) นอกจากนี้คุณยังสามารถค้นหาพลังในการตรวจจับการรวมกันของเอฟเฟกต์เฉพาะหรือสำหรับการทดสอบพลังพร้อมกันของแบบจำลองทั้งหมด ฉันเดาจากคำอธิบายรหัส SAS ของคุณว่ามันกำลังมองหาหลัง อย่างไรก็ตามจากคำอธิบายของคุณเกี่ยวกับสถานการณ์ของคุณฉันถือว่าคุณต้องการตรวจจับเอฟเฟกต์อย่างน้อยที่สุด

  • สำหรับวิธีอื่นในการคิดเกี่ยวกับปัญหาที่เกี่ยวข้องกับพลังงานดูคำตอบของฉันที่นี่: วิธีการรายงานความแม่นยำทั่วไปในการประมาณค่าสหสัมพันธ์ภายในบริบทของการปรับขนาดตัวอย่างให้เหมาะสม

พลังโพสต์เฉพาะกิจง่าย ๆ สำหรับการถดถอยโลจิสติกใน R:

สมมติว่าอัตราการตอบสนองของคุณแสดงถึงสถานการณ์จริงในโลกและคุณได้ส่งจดหมาย 10,000 ฉบับแล้ว พลังในการตรวจจับผลกระทบเหล่านั้นคืออะไร? (โปรดทราบว่าฉันมีชื่อเสียงในการเขียนโค้ด "ไม่มีประสิทธิภาพตลก ๆ " ต่อไปนี้มีวัตถุประสงค์เพื่อให้ง่ายต่อการติดตามแทนที่จะปรับให้เหมาะสำหรับประสิทธิภาพในความเป็นจริงมันค่อนข้างช้า)

set.seed(1)

repetitions = 1000
N = 10000
n = N/8
var1  = c(   .03,    .03,    .03,    .03,    .06,    .06,    .09,   .09)
var2  = c(     0,      0,      0,      1,      0,      1,      0,     1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)

var1    = rep(var1, times=n)
var2    = rep(var2, times=n)
var12   = var1**2
var1x2  = var1 *var2
var12x2 = var12*var2

significant = matrix(nrow=repetitions, ncol=7)

startT = proc.time()[3]
for(i in 1:repetitions){
  responses          = rbinom(n=N, size=1, prob=rates)
  model              = glm(responses~var1+var2+var12+var1x2+var12x2, 
                           family=binomial(link="logit"))
  significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
  significant[i,6]   = sum(significant[i,1:5])
  modelDev           = model$null.deviance-model$deviance
  significant[i,7]   = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.017

ดังนั้นเราจึงเห็นว่า 10,000 ตัวอักษรไม่ได้รับพลังงาน 80% (ทุกประเภท) เพื่อตรวจจับอัตราการตอบสนองเหล่านี้ (ฉันไม่แน่ใจเพียงพอเกี่ยวกับสิ่งที่รหัส SAS กำลังทำเพื่ออธิบายความแตกต่างโดยสิ้นเชิงระหว่างวิธีการเหล่านี้ แต่รหัสนี้เป็นแนวคิดที่ตรงไปตรงมา - ถ้าช้า - และฉันใช้เวลาในการตรวจสอบและฉันคิดว่าสิ่งเหล่านี้ ผลลัพธ์มีความสมเหตุสมผล)

การจำลองกำลัง a-Priori สำหรับการถดถอยโลจิสติก:

จากที่นี่ความคิดนั้นเป็นเพียงการค้นหาเป็นไปได้จนกว่าเราจะพบค่าที่ให้ระดับของพลังงานที่คุณต้องการสนใจกลยุทธ์การค้นหาใด ๆ ที่คุณสามารถใช้รหัสเพื่อทำงานกับสิ่งนี้จะดี (ใน ทฤษฎี). เมื่อพิจารณาจากที่จะต้องจับเอฟเฟกต์เล็ก ๆ เหล่านี้มันก็คุ้มค่าที่จะคิดว่าจะทำสิ่งนี้ได้อย่างมีประสิทธิภาพมากขึ้น วิธีการทั่วไปของฉันคือแรงเดรัจฉานเพียงอย่างเดียวคือการประเมินแต่ละที่ฉันอาจพิจารณาอย่างสมเหตุสมผล (หมายเหตุอย่างไรก็ตามโดยทั่วไปแล้วฉันจะพิจารณาเฉพาะช่วงเล็ก ๆ เท่านั้นและโดยทั่วไปฉันทำงานกับน้อยมาก- อย่างน้อยเมื่อเทียบกับสิ่งนี้) N N N NNNNN

แต่กลยุทธ์ของฉันในที่นี้คือเพื่อยึดเป็นไปได้เพื่อให้ได้ความรู้สึกของพลังที่หลากหลาย ดังนั้นฉันเลือกของ 500,000 และเรียกใช้โค้ดอีกครั้ง (เริ่มต้นเมล็ดเดียวกัน nb ซึ่งใช้เวลาหนึ่งชั่วโมงครึ่งในการรัน) นี่คือผลลัพธ์: NNN

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.606

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

ฉันควรทราบโดยสรุปว่าเนื่องจากความซับซ้อนและขนาดใหญ่ที่เกี่ยวข้องในสถานการณ์ของคุณจึงไม่ง่ายอย่างที่ฉันสงสัย / อ้างสิทธิ์ในความคิดเห็นเริ่มต้นของฉัน อย่างไรก็ตามคุณสามารถได้รับแนวคิดเกี่ยวกับวิธีการนี้โดยทั่วไปและประเด็นที่เกี่ยวข้องกับการวิเคราะห์พลังงานจากสิ่งที่ฉันได้วางไว้ที่นี่ HTH N


Gung - ว้าวขอบคุณมากสำหรับคำตอบที่ละเอียดและรอบคอบ! ในการเขียนของฉันเองและเล่นกับโค้ดของคุณเงื่อนไขกำลังสองดูเหมือนจะเป็นปัญหา - เนื่องจากพลังงานอย่างน้อย 80% สามารถทำได้โดยมีขนาดตัวอย่างที่เล็กกว่ามากโดยไม่พิจารณาในโมเดล
B_Miner

1
ยอดเยี่ยม @B_Miner นั่นเป็นสิ่งที่คุณอยากทำ ยิ่งกว่านั้นเป็นเหตุผลที่ฉันคิดว่าวิธีการจำลองแบบดีกว่าซอฟต์แวร์การวิเคราะห์ที่แยกออกมาเป็นจำนวนมาก (R มีpwrแพคเกจนี้เช่นกัน) วิธีการนี้เปิดโอกาสให้คุณคิดได้ชัดเจนยิ่งขึ้น (& / หรือปรับแต่งความคิดของคุณ) เกี่ยวกับสิ่งที่คุณคาดหวังว่าจะเกิดขึ้นได้อย่างไรคุณจะจัดการกับสิ่งนั้นได้อย่างไร NB หมายเหตุอย่างไรว่าคุณต้องการเงื่อนไขกำลังสองหรืออะไรบางอย่าง ถ้าอัตราที่คุณตั้งไว้ถูกต้อง b / c ไม่ใช่เชิงเส้นและการมีปฏิสัมพันธ์เพียงอย่างเดียวไม่อนุญาตให้คุณจับความสัมพันธ์ของเส้นโค้ง
gung - Reinstate Monica

ฉันคิดว่าคุณควรแสดงให้เห็นถึงการใช้polyแทนที่จะแสดงผู้ใช้ใหม่ของ R ซึ่งเป็นกลยุทธ์ที่มีข้อผิดพลาดมากกว่าในการหาค่าดิบ glm(responses~ poly(var1, 2) * var2, family=binomial(link="logit")ผมคิดว่ารูปแบบเต็มรูปแบบควรได้รับการโพสต์เมื่อ มันจะเป็นไปได้น้อยที่จะเกิดข้อผิดพลาดทางสถิติในการตีความและการกระชับมากขึ้น อาจไม่สำคัญในกรณีนี้เมื่อคุณดูแบบโดยรวมเท่านั้น แต่อาจทำให้ผู้ใช้ที่มีความซับซ้อนน้อยเข้าใจผิดได้ง่ายซึ่งอาจถูกล่อลวงให้ดูคำศัพท์แต่ละคำ
DWIN

@DWin เมื่อฉันใช้ R เพื่อแสดงสิ่งต่าง ๆ ที่นี่ใน CV ฉันทำในลักษณะที่ไม่ใช้ R มาก ความคิดจะโปร่งใสเท่าที่จะเป็นไปได้สำหรับผู้ที่ไม่คุ้นเคยกับอาร์เช่นฉันไม่ได้ใช้ความเป็นไปได้เวกเตอร์กำลังใช้ลูป=ฯลฯ ผู้คนจะคุ้นเคยกับตัวแปรกำลังสองจากการถดถอยขั้นพื้นฐานมากขึ้น ชั้นเรียนและรับรู้สิ่งที่น้อยกว่าpoly()หากพวกเขาไม่ใช่ผู้ใช้ R
gung - Reinstate Monica

17

@ คำตอบของ Gung นั้นยอดเยี่ยมสำหรับการทำความเข้าใจ นี่คือวิธีที่ฉันจะใช้:

mydat <- data.frame( v1 = rep( c(3,6,9), each=2 ),
    v2 = rep( 0:1, 3 ), 
    resp=c(0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002) )

fit0 <- glm( resp ~ poly(v1, 2, raw=TRUE)*v2, data=mydat,
    weight=rep(100000,6), family=binomial)
b0 <- coef(fit0)


simfunc <- function( beta=b0, n=10000 ) {
    w <- sample(1:6, n, replace=TRUE, prob=c(3, rep(1,5)))
    mydat2 <- mydat[w, 1:2]
    eta <- with(mydat2,  cbind( 1, v1, 
                v1^2, v2,
                v1*v2,
                v1^2*v2 ) %*% beta )
    p <- exp(eta)/(1+exp(eta))
    mydat2$resp <- rbinom(n, 1, p)

    fit1 <- glm( resp ~ poly(v1, 2)*v2, data=mydat2,
        family=binomial)
    fit2 <- update(fit1, .~ poly(v1,2) )
    anova(fit1,fit2, test='Chisq')[2,5]
}

out <- replicate(100, simfunc(b0, 10000))
mean( out <= 0.05 )
hist(out)
abline(v=0.05, col='lightgrey')

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

ที่นี่ฉันทำซ้ำ 100 ครั้งฉันมักจะเริ่มต้นในระดับนั้นเพื่อหาขนาดตัวอย่างโดยประมาณแล้วเพิ่มการวนซ้ำเมื่อฉันอยู่ในสวนบอลที่ถูกต้อง (ไม่ต้องเสียเวลาในการทำซ้ำ 10,000 เมื่อคุณมีพลังงาน 20%)


ขอบคุณ Greg! ฉันสงสัยเกี่ยวกับวิธีการเดียวกันนี้ (ถ้าฉันเข้าใจถูกต้องว่าคุณทำอะไร) ในการยืนยัน: คุณกำลังสร้างชุดข้อมูล (มีผล แต่ให้ทำด้วยน้ำหนักแทนที่จะเป็นเดรัจฉานบังคับสร้างแต่ละระเบียนของค่าของ Var1 และ Var2 และจากนั้น 1 และ 0 สำหรับการตอบสนอง) ที่มีขนาดใหญ่มากตาม "mydat" เหมาะสมกับการถดถอยโลจิสติกแล้วใช้สัมประสิทธิ์เหล่านั้นเพื่อสุ่มตัวอย่างจากแบบจำลองที่เสนอในการจำลอง ดูเหมือนว่านี่เป็นวิธีทั่วไปในการหาค่าสัมประสิทธิ์ - เช่นเดียวกับการตอบสนองของคุณเกี่ยวกับอำนาจการถดถอยตามลำดับที่ฉันเชื่อมโยง
B_Miner

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

ฉันถูกต้องหรือไม่ว่าคุณกำลังใช้ข้อมูลเริ่มต้น (ทำให้เป็นเรื่องใหญ่เพื่อให้ได้ค่าประมาณที่ดีมาก) เพื่อจุดประสงค์ในการรับค่าสัมประสิทธิ์ที่ใช้?
B_Miner

ใช่ขนาดใหญ่ก็คือสัดส่วนที่คูณกับน้ำหนักให้จำนวนเต็ม
เกร็กสโนว์

2
@B_Miner ฉันกำลังวางแผนบทความฉันไม่รู้ว่ามีหนังสือเพียงพอหรือไม่ แต่ขอขอบคุณสำหรับกำลังใจ
เกร็กสโนว์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.