ฉันจะเพิ่มความเร็วในการคำนวณผลกระทบคงที่ใน GLMM ได้อย่างไร


9

ฉันกำลังทำการศึกษาแบบจำลองที่ต้องใช้การประเมินการบูตแบบจำลองที่ได้จากโมเดลเชิงเส้นเชิงเส้นแบบทั่วไป ในการทำการศึกษาให้ดีนั้นจะต้องใช้แบบจำลองประมาณ 1,000 ครั้งโดยมี 1,000 หรือ 1,500 บูตสแตรปแบบจำลองในแต่ละครั้ง คอมพิวเตอร์ของฉันใช้เวลานานพอสมควร (หลายวัน)

How can I speed up the computation of these fixed effects?

โดยเฉพาะอย่างยิ่งฉันมีวิชาที่วัดซ้ำ ๆ ในสามวิธีก่อให้เกิดตัวแปร X, M, และ Y โดยที่ X และ M ต่อเนื่องและ Y เป็นเลขฐานสอง เรามีสมการการถดถอยสองตัว Y ^ * = \ beta_0 + \ beta_1X + \ beta_2M + \ epsilon_2 โดยที่ Y ^ *เป็นตัวแปรต่อเนื่องแฝงแฝงสำหรับYและข้อผิดพลาดไม่ใช่ iid สถิติที่เราต้องการที่จะบูตเป็น\ alpha_1 \ beta_2 ดังนั้นการจำลองแบบบู๊ตสแตรปแต่ละครั้งต้องมีการติดตั้ง LMM และ GLMM รหัส R ของฉันคือ (ใช้ lme4)

M=α0+α1X+ϵ1
Y=β0+β1X+β2M+ϵ2
Y
α1β2
    stat=function(dat){
        a=fixef(lmer(M~X+(X|person),data=dat))["X"]
        b=fixef(glmer(Y~X+M+(X+M|person),data=dat,family="binomial"))["M"]
        return(a*b)
    }

ฉันรู้ว่าฉันได้รับการประมาณการเดียวกันα1ถ้าฉันเพียงแค่พอดีมันเป็นรูปแบบเชิงเส้นเพื่อที่จะช่วยประหยัดเวลา แต่เคล็ดลับเดียวกันไม่ทำงานสำหรับ\β2

ฉันต้องซื้อคอมพิวเตอร์ที่เร็วกว่านี้ไหม :)


1
@BR คอขวดนี่คืออะไร? โดยทั่วไปสิ่งที่ต้องใช้เวลาRprofมา
suncoolsu

1
วิธีหนึ่งคือเพียงแค่ละเว้นส่วน "ผสม" ของ GLMM เพียงแค่พอดีกับ GLM ปกติการประมาณการจะไม่เปลี่ยนแปลงมากนัก แต่ข้อผิดพลาดมาตรฐานของพวกเขาอาจจะเป็น
ความน่าจะเป็นทาง

@probabilityislogic นอกจากคำพูดของคุณฉันยังคิดด้วยว่าคำตอบจะแตกต่างกันมากหรือไม่ขึ้นอยู่กับขนาดของกลุ่มและพฤติกรรมของแต่ละบุคคลในกลุ่ม ดังที่ Gelman และ Hill กล่าวว่า: ผลลัพธ์ของโมเดลเอฟเฟกต์แบบผสมจะอยู่ระหว่างการรวมกำไรและไม่รวมกำไร (ข้อสังเกตนี้ใช้สำหรับตัวแบบลำดับชั้นแบบเบย์ แต่ตัวแบบผสมเป็นวิธีคลาสสิกในการทำแบบเดียวกัน)
suncoolsu

@probabilityislogic: ใช้งานได้กับ LMM แต่ดูเหมือนว่าจะล้มเหลวสำหรับ GLMM (หมายความว่าฉันรันโมเดลที่มีและไม่มี M พิเศษในข้อมูลเดียวกันและจบลงด้วยผลลัพธ์ที่แตกต่างกันมาก) แน่นอนว่าไม่มีข้อผิดพลาดในการติดตั้ง glmer
BR

@suncoolsu: คอขวดคือการประมาณของ GLMM ซึ่งอาจใช้เวลาสองสามวินาที (โดยเฉพาะอย่างยิ่งกับเอฟเฟกต์แบบสุ่มหลายอย่าง) แต่ทำ 1,000 * 1,000 ครั้งและนั่นคือการคำนวณ 280 ชั่วโมง การติดตั้ง GLM จะใช้เวลาประมาณ 1/100 ของเวลา
BR

คำตอบ:


4

มันควรช่วยในการระบุค่าเริ่มต้นแม้ว่ามันจะยากที่จะรู้ว่าเท่าไหร่ ในขณะที่คุณทำการจำลองสถานการณ์และการเริ่มระบบคุณควรทราบค่า 'จริง' หรือค่าประมาณที่ไม่ได้บูตสตริปหรือทั้งสองอย่าง ลองใช้ผู้ที่อยู่ในตัวเลือกของstart =glmer

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


4

ความเป็นไปได้อื่น ๆ ที่ควรพิจารณาก่อนตัดสินใจซื้อคอมพิวเตอร์เครื่องใหม่

  1. การคำนวณแบบขนาน - การบูตสแตรปทำได้ง่ายในแบบคู่ขนาน หากคอมพิวเตอร์ของคุณใหม่พอสมควรคุณอาจมีสี่คอร์ ลองดูที่multicore ไลบรารี่ใน R
  2. การคำนวณแบบคลาวด์ยังมีความเป็นไปได้และราคาถูกพอสมควร ฉันมีเพื่อนร่วมงานที่ใช้ amazon cloud เพื่อเรียกใช้สคริปต์ R พวกเขาพบว่ามันค่อนข้างคุ้มราคา

1
ขอบคุณสำหรับคำตอบ. อย่างใดฉันก็มองข้ามความจริงที่ว่าฉันมีสองแกน (คอมพิวเตอร์ของฉันไม่ได้ใหม่มาก) ฉันควรจะดู multicore นานแล้ว
BR

2

มันอาจเป็นคอมพิวเตอร์ที่เร็วกว่าก็ได้ แต่นี่คือเคล็ดลับหนึ่งที่อาจใช้งานได้

สร้างการจำลองของแต่มีเงื่อนไขเฉพาะบนจากนั้นเพียงทำ OLS หรือ LMM บนค่าจำลองขึ้นมาYYY

เผื่อว่าฟังก์ชั่นการเชื่อมโยงของคุณเป็น(.) นี้กล่าวว่าวิธีการที่คุณได้รับจากความน่าจะเป็นของกับคุ้มค่าและมีแนวโน้มมากที่สุดฟังก์ชั่นโลจิสติกใหญ่)g(.)Y=1Yg(z)=log(z1z)

ดังนั้นถ้าคุณสมมติว่าการแจกแจงการสุ่มตัวอย่าง bernouli สำหรับและจากนั้นใช้ jeffreys ก่อนความน่าจะเป็นคุณจะได้รับหลังเบต้าสำหรับ{2}) การจำลองจากสิ่งนี้ควรเป็นแสงสว่างและหากไม่เป็นเช่นนั้นคุณต้องมีคอมพิวเตอร์ที่เร็วขึ้น นอกจากนี้ตัวอย่างมีความเป็นอิสระดังนั้นจึงไม่จำเป็นต้องตรวจสอบการวินิจฉัย "รวมกัน" ใด ๆ เช่นใน MCMC และคุณอาจไม่ต้องการตัวอย่างจำนวนมาก - 100 อาจทำงานได้ดีสำหรับกรณีของคุณ ถ้าคุณมีทวินามแล้วก็แทนที่ในหลังข้างต้นด้วย , จำนวนของการทดลองของทวินามสำหรับแต่ละY_iYYBernoulli(p)pBeta(Yobs+12,1Yobs+12)Ys1niYi

เพื่อให้คุณมีชุดของค่าจำลอง{} จากนั้นคุณสามารถใช้ฟังก์ชั่นการเชื่อมโยงไปแต่ละค่าเหล่านี้จะได้รับ{ซิม}) พอดี LMM ถึงซึ่งน่าจะเร็วกว่าโปรแกรม GLMM คุณสามารถเพิกเฉยกับค่าไบนารี่ดั้งเดิมได้ (แต่อย่าลบทิ้ง!) และเพียงแค่ทำงานกับ "เมทริกซ์การจำลอง" (โดยที่คือขนาดตัวอย่างและคือจำนวนของการจำลอง)psimYsim=g(psim)YsimN×SNS

ดังนั้นในโปรแกรมของคุณฉันจะแทนที่ฟังก์ชั่นด้วยฟังก์ชันและด้วยการจำลองเดี่ยวคุณจะสร้างลูปบางประเภทซึ่งใช้กับการจำลองแต่ละครั้งจากนั้นจึงนำ โดยเฉลี่ยประมาณการของขบางสิ่งบางอย่างเช่น gmler()lmer()Ylmer()b

a=
b=0
do s=1,,S
best=lmer(Ys)
b=b+1s(bestb)
end
return(ab)

แจ้งให้เราทราบหากฉันต้องการอธิบายอะไรให้ชัดเจนยิ่งขึ้น


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