วิธีการพอดีกับแบบผสมกับตัวแปรการตอบสนองระหว่าง 0 และ 1


15

ฉันกำลังพยายามใช้lme4::glmer()ให้พอดีกับแบบจำลองผสมแบบทวินามทั่วไป (GLMM) กับตัวแปรตามที่ไม่ใช่ไบนารี แต่เป็นตัวแปรต่อเนื่องระหว่างศูนย์ถึงหนึ่ง ใคร ๆ ก็นึกถึงตัวแปรนี้ว่าเป็นความน่าจะเป็น ในความเป็นจริงมันเป็นความน่าจะเป็นตามรายงานของมนุษย์ (ในการทดลองที่ฉันช่วยวิเคราะห์) คือมันไม่ใช่เศษส่วนแบบแยก แต่เป็นตัวแปรต่อเนื่อง

glmer()สายของฉันไม่ทำงานตามที่คาดไว้ (ดูด้านล่าง) ทำไม? ฉันควรทำอย่างไร

แก้ไขในภายหลัง: คำตอบของฉันด้านล่างกว้างกว่าคำถามเดิมของรุ่นนี้ดังนั้นฉันจึงแก้ไขคำถามให้กว้างขึ้นเช่นกัน


รายละเอียดเพิ่มเติม

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

glm(reportedProbability ~ a + b + c, myData, family="binomial")

ฉันได้รับข้อความเตือน

Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

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

อย่างไรก็ตามสิ่งที่ฉันต้องการใช้จริงๆคือ

glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")

มันให้คำเตือนเหมือนกันส่งคืนโมเดล แต่โมเดลนี้ชัดเจนมาก ประมาณการของผลกระทบคงที่ไกลจากglm()คนและจากวิธีการข้ามเรื่อง (และฉันต้องรวมglmerControl(optimizer="bobyqa")ไว้ในการglmerโทรไม่อย่างนั้นมันจะไม่รวมกันเลย)


1
วิธีการเกี่ยวกับการแปลงความน่าจะเป็นครั้งแรก คุณจะได้อะไรที่ใกล้เคียงกับการแจกแจงแบบปกติด้วยการแปลงโลจิต หรือ arcsin-sqrt นั่นจะเป็นความชอบของฉันมากกว่าที่จะใช้เสน่ห์มากกว่า หรือในโซลูชันแฮ็คของคุณคุณสามารถลองเพิ่มเอฟเฟกต์แบบสุ่มสำหรับการสังเกตแต่ละครั้งเพื่ออธิบายการด้อยค่าเนื่องจากน้ำหนักที่คุณเลือก
Aaron ออกจาก Stack Overflow

ขอบคุณ ใช่ฉันสามารถบันทึก DV แล้วใช้รูปแบบผสมแบบเกาส์ (lmer) แต่นี่ก็เป็นแฮ็คชนิดหนึ่งและฉันได้อ่านว่าไม่แนะนำ ฉันจะลองเอฟเฟกต์แบบสุ่มสำหรับการสังเกตแต่ละครั้ง! ในขณะนี้ฉันกำลังลองรุ่นผสมเบต้า lme4 ไม่สามารถจัดการได้ แต่ glmmadmb สามารถ เมื่อฉันวิ่งglmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta")ฉันได้รับความพอดีและช่วงความเชื่อมั่นที่เหมาะสม แต่การบรรจบกันล้มเหลวเตือน: - / พยายามหาวิธีเพิ่มจำนวนการวนซ้ำ เบต้าอาจใช้ได้สำหรับฉันเพราะฉันไม่มี DV = 0 หรือ DV = 1 ราย
อะมีบาพูดว่า Reinstate Monica

ฉันไม่ทราบว่ามีความกระจ่างใส แต่สำหรับ glm สิ่งนี้อาจช่วยได้: stats.stackexchange.com/questions/164120/… :

1
@Aaron: ฉันพยายามเพิ่ม+ (1 | rowid)การโทรให้มากขึ้นและนี่ทำให้ได้ค่าประมาณที่เสถียรและช่วงความเชื่อมั่นที่มั่นคงโดยไม่ขึ้นอยู่กับการเลือกน้ำหนักของฉัน (ฉันลอง 100 และ 500) ฉันยังลองใช้ lmer ใน logit (รายงานความน่าจะเป็น) และฉันก็เกือบจะเหมือนกันหมด ดังนั้นโซลูชันทั้งคู่จึงทำงานได้ดี! Beta MM ที่มี glmmadmb นั้นให้ผลลัพธ์ที่ใกล้เคียงกัน แต่ด้วยเหตุผลบางประการที่ทำให้การบรรจบกันไม่สมบูรณ์และใช้เวลานานในการทำงาน ลองโพสต์คำตอบที่แสดงรายการตัวเลือกเหล่านี้และอธิบายถึงความแตกต่างและข้อดี / ข้อเสีย! (ช่วงความเชื่อมั่นที่ฉันพูดถึงคือ Wald ทั้งหมด)
อะมีบาพูดว่า Reinstate Monica

1
และพวกเขามีความแน่นอนเกี่ยวกับค่าของพวกเขาเช่น 0.9 หรือพวกเขายังมี '' ขอบข้อผิดพลาดในมัน ''? คุณสามารถสมมติว่าความมั่นใจที่รายงานโดยวิชาที่แตกต่างกันนั้นมีความแม่นยำเท่าเทียมกันหรือไม่?

คำตอบ:


21

มันสมเหตุสมผลแล้วที่จะเริ่มด้วยกรณีที่ง่ายกว่าโดยไม่มีเอฟเฟกต์แบบสุ่ม

มีสี่วิธีในการจัดการกับตัวแปรการตอบสนองแบบ zero-to-one อย่างต่อเนื่องที่มีพฤติกรรมเหมือนเศษส่วนหรือความน่าจะเป็น ( นี่คือหัวข้อที่ยอมรับได้ / upvoted / ดูมากที่สุดของเราในหัวข้อนี้ แต่น่าเสียดายที่ไม่กล่าวถึงตัวเลือกทั้งสี่)

  1. พี=ม./nnnยังไม่มีข้อความ

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. พีพี01

    betareg(p ~ a+b+c, myData)
  3. Logit แปลงการตอบสนองและใช้การถดถอยเชิงเส้น สิ่งนี้มักไม่แนะนำ

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. พอดีกับโมเดลทวินาม แต่จากนั้นคำนวณข้อผิดพลาดมาตรฐานโดยคำนึงถึงการกระจายตัวมากเกินไป ข้อผิดพลาดมาตรฐานสามารถคำนวณได้หลายวิธี:

    • (a) ปรับขนาดข้อผิดพลาดมาตรฐานผ่านการประมาณการกระจายตัวเกิน ( หนึ่ง , สอง ) สิ่งนี้เรียกว่า "quasi-binomial" GLM

    • (b) ข้อผิดพลาดมาตรฐานที่แข็งแกร่งผ่านตัวประมาณแซนวิช ( หนึ่ง , สอง , สาม , สี่ ) สิ่งนี้เรียกว่า "การบันทึกเศษส่วน" ในเศรษฐมิติ


    (ก) และ (ข) ไม่เหมือนกัน (ดูความคิดเห็นนี้และส่วนที่ 3.4.1 และ 3.4.2 ในหนังสือเล่มนี้และโพสต์ SOและคนนี้และคนนี้ ) แต่มีแนวโน้มที่จะให้ผลที่คล้ายกัน ตัวเลือก (a) มีการใช้งานในglmดังนี้:

    glm(p ~ a+b+c, myData, family="quasibinomial")

วิธีการสี่แบบเดียวกันนี้มีผลแบบสุ่ม

  1. ใช้weightsอาร์กิวเมนต์ ( หนึ่ง , สอง ):

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    ตามลิงก์ที่สองด้านบนอาจเป็นความคิดที่ดีที่จะสร้างแบบจำลองการกระจายเกินจริงดูที่นั่น (และ # 4 ด้านล่าง)

  2. ใช้รุ่นผสมเบต้า:

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    หรือ

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))

    หากมีศูนย์ที่แน่นอนหรือคนในข้อมูลการตอบสนองแล้วหนึ่งสามารถใช้รูปแบบเบต้าศูนย์ / glmmTMBหนึ่งในที่สูงเกินจริง

  3. ใช้ logit transform ของการตอบสนอง:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. การบัญชีสำหรับ overdispersion ในรูปแบบทวินาม วิธีนี้ใช้เคล็ดลับที่แตกต่าง: การเพิ่มเอฟเฟกต์แบบสุ่มสำหรับแต่ละจุดข้อมูล:

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))

    ด้วยเหตุผลบางอย่างนี้ไม่ได้ทำงานอย่างถูกต้องตามglmer()บ่นเรื่องที่ไม่ใช่จำนวนเต็มpและอัตราผลตอบแทนประมาณการเรื่องไร้สาระ วิธีแก้ปัญหาที่ฉันใช้คือการใช้ค่าคงที่ปลอมweights=kและตรวจสอบให้แน่ใจว่าp*kเป็นจำนวนเต็มเสมอ ต้องมีการปัดเศษpแต่ด้วยการเลือกkที่มีขนาดใหญ่พอที่จะไม่สำคัญมาก kผลดูเหมือนจะไม่ได้ขึ้นอยู่กับค่าของ

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))

    อัปเดตในภายหลัง (ม.ค. 2018):นี่อาจเป็นวิธีที่ไม่ถูกต้อง ดูการอภิปรายที่นี่ ฉันต้องตรวจสอบสิ่งนี้เพิ่มเติม


ในตัวเลือกกรณีเฉพาะของฉัน # 1 ไม่สามารถใช้ได้

ตัวเลือก # 2 ช้ามากและมีปัญหาเกี่ยวกับการบรรจบ: glmmadmbใช้เวลาสิบห้านาทีในการทำงาน (และยังคงบ่นว่ามันไม่ได้มาบรรจบกัน!) ในขณะที่lmerทำงานในเสี้ยววินาทีและglmerใช้เวลาสองสามวินาที อัปเดต:ฉันลองglmmTMBตามที่แนะนำในความคิดเห็นโดย @BenBolker และทำงานเกือบเร็วเท่าglmerโดยไม่มีปัญหาการบรรจบกัน นี่คือสิ่งที่ฉันจะใช้

ตัวเลือก # 3 และ # 4 ให้ผลการประมาณการที่คล้ายกันมากและช่วงความเชื่อมั่นของ Wald ที่ใกล้เคียงกันมาก (ที่ได้รับconfint) ฉันไม่ใช่แฟนตัวยงของ # 3 แต่เป็นเพราะการโกง และ # 4 รู้สึกแฮ็คค่อนข้าง

ขอบคุณมากสำหรับ @Aaron ที่ชี้ให้ฉันไปที่ # 3 และ # 4 ในความคิดเห็นของเขา


1
คำตอบที่ดีอธิบายได้ดีและเชื่อมต่อกับรุ่นไม่มีเอฟเฟกต์แบบสุ่ม ฉันจะไม่เรียกการโกง # 3 (การเปลี่ยนแปลง) ว่าการแปลงแบบนั้นเป็นเรื่องธรรมดามากในการวิเคราะห์แบบนี้ ฉันจะบอกว่าทั้ง # 3 และ # 4 กำลังตั้งสมมติฐานเกี่ยวกับความสัมพันธ์เกี่ยวกับการกระจายของข้อมูลและยังเกี่ยวกับความสัมพันธ์ระหว่างค่าเฉลี่ยและความแปรปรวนและเนื่องจาก # 4 คือการสร้างแบบจำลองในระดับที่ข้อมูล ถูกรวบรวมในไม่ได้หมายความว่าสมมติฐานเหล่านั้นจะดีขึ้น
แอรอนออกจาก Stack Overflow

1
# 3 สมมติว่า logit ของความน่าจะเป็นเรื่องปกติพร้อมความแปรปรวนคงที่ในขณะที่ # 4 ถือว่าความแปรปรวนเป็นสัดส่วนกับ p (1-p) จากคำอธิบายความพอดีของคุณสิ่งเหล่านี้ดูเหมือนจะคล้ายกันมากพอที่จะไม่สำคัญเกินไป และ # 3 เป็นมาตรฐานที่แน่นอนกว่า (ขึ้นอยู่กับผู้ชมของคุณ) ดังนั้นหากการวินิจฉัยมีความสมเหตุสมผลนั่นเป็นสิ่งที่ฉันต้องการ
แอรอนออกจาก Stack Overflow

1
ความเป็นไปได้อีกอย่างคือการใช้glmmTMB ; หลังจากติดตั้งกับdevtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB")ที่ใช้glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))ควรจะทำงาน ...
เบน Bolker

@BenBolker ขอบคุณ! มีเหตุผลใดที่จะชอบ glmmTMB ถึง glmmADMB (สำหรับรุ่นเบต้า) หรือในทางกลับกัน? หนึ่งในแพคเกจเหล่านี้มีการพัฒนาล่าสุดหรือมากกว่านี้หรือไม่ นอกจากนั้นฉันขอถามว่าแนวทางใดบ้างที่ระบุไว้ในคำตอบนี้ - gaussian glmm หลังจากการแปลง logit, beta glmm หรือ binomial glmm ที่มี (1 | rowid) - คุณคิดว่าเป็นที่นิยมกว่าไหม?
อะมีบาพูดว่า Reinstate Monica

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