0 और 1 के बीच प्रतिक्रिया चर के साथ एक मिश्रित मॉडल कैसे फिट करें?


15

मैं lme4::glmer()द्विआधारी सामान्यीकृत मिश्रित मॉडल (GLMM) को आश्रित चर के साथ उपयोग करने की कोशिश कर रहा हूं जो कि बाइनरी नहीं है, लेकिन शून्य और एक के बीच एक निरंतर चर है। इस चर को एक संभावना के रूप में सोच सकते हैं; वास्तव में यह मानव विषयों (एक प्रयोग है कि मैं विश्लेषण करने में मदद करता है) द्वारा रिपोर्ट के रूप में संभावना है। यानी यह नहीं एक "असतत" अंश है, लेकिन एक निरंतर चर।

मेरी glmer()कॉल अपेक्षा के अनुरूप काम नहीं करती (नीचे देखें)। क्यों? मैं क्या कर सकता हूँ?

बाद में संपादित करें: नीचे दिए गए मेरे उत्तर इस प्रश्न के मूल संस्करण से अधिक सामान्य हैं, इसलिए मैंने इस प्रश्न को और अधिक सामान्य होने के लिए संशोधित किया।


अधिक जानकारी

स्पष्ट रूप से न केवल बाइनरी डीवी के लिए, बल्कि शून्य और एक के बीच निरंतर डीवी के लिए भी लॉजिस्टिक रिग्रेशन का उपयोग करना संभव है। दरअसल, जब मैं दौड़ता हूं

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
पहले संभावनाओं को बदलने के बारे में कैसे? क्या आप ऐसा कुछ प्राप्त कर सकते हैं, जो सामान्य रूप से कहने के लिए वितरित किया जाता है, एक परिवर्तन लॉग? या आर्क्सिन-वर्गर्ट? यह ग्लैमर का उपयोग करने के बजाय मेरी प्राथमिकता होगी। या आपके हैक समाधान में, आप वेट की अपनी पसंद के कारण प्रत्येक अवलोकन के लिए एक यादृच्छिक प्रभाव जोड़ने की कोशिश कर सकते हैं।
हारून ने

धन्यवाद। हां, मैं DV को लॉग इन कर सकता हूं और फिर गाऊसी मिश्रित मॉडल (lmer) का उपयोग कर सकता हूं, लेकिन यह भी एक तरह का हैक है, और मैंने पढ़ा है कि यह अनुशंसित नहीं है। मैं प्रत्येक अवलोकन के लिए एक यादृच्छिक प्रभाव की कोशिश करूँगा! फिलहाल, मैं बीटा मिश्रित मॉडल की कोशिश कर रहा हूं; lme4 इसे संभाल नहीं सकता है, लेकिन glmmadmb कर सकता है। जब मैं दौड़ता हूं glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta"), तो मुझे सही फिट और उचित आत्मविश्वास अंतराल मिलते हैं, लेकिन एक अभिसरण चेतावनी को विफल कर देता है: - / यह जानने की कोशिश करना कि पुनरावृत्तियों की संख्या कैसे बढ़ाई जाए। बीटा मेरे लिए काम कर सकता है क्योंकि मेरे पास DV = 0 या DV = 1 मामले नहीं हैं।
अमीबा का कहना है कि मोनिका

मैं ग्लमर के लिए नहीं जानता, लेकिन glm के लिए यह मदद कर सकता है: आंकड़े.stackexchange.com/questions/164120/… :

1
@ ऐरन: मैंने + (1 | rowid)अपने ग्लैमर कॉल को जोड़ने की कोशिश की और यह मेरे वजन विकल्प से स्वतंत्र स्थिर अनुमानों और स्थिर आत्मविश्वास अंतराल की पैदावार करता है (मैंने 100 और 500 की कोशिश की)। मैंने लॉजिट (रिपोर्टपिरैबिलिटी) पर लैमर चलाने की भी कोशिश की और मुझे लगभग यही बात मिली। तो दोनों समाधान अच्छी तरह से काम करने लगते हैं! Glmmadmb के साथ बीटा MM भी बहुत करीबी परिणाम देता है, लेकिन किसी कारण से पूरी तरह से एकाग्र नहीं हो पाता है और हमेशा के लिए चलता है। इन विकल्पों को सूचीबद्ध करने वाले उत्तर को पोस्ट करने पर विचार करें और थोड़ा अंतर और पेशेवरों / विपक्षों को समझाएं! (विश्वास अंतराल जो मैंने उल्लेख किया है, सभी वाल्ड हैं।)
अमीबा कहते हैं कि मोनिका

1
और वे अपने मूल्य के बारे में बिल्कुल निश्चित हैं जैसे कि 0.9, या क्या उनके पास कुछ '' त्रुटि मार्जिन '' भी है? क्या आप यह मान सकते हैं कि विभिन्न विषयों द्वारा बताए गए आत्मविश्वास समान रूप से सटीक हैं?

जवाबों:


21

यह कोई यादृच्छिक प्रभाव के एक सरल मामले के साथ शुरू करने के लिए समझ में आता है।

निरंतर शून्य-से-एक प्रतिक्रिया चर से निपटने के चार तरीके हैं जो एक अंश या प्रायिकता की तरह व्यवहार करते हैं ( यह इस विषय पर हमारे सबसे अधिक विहित / उत्कीर्ण / देखे गए धागे हैं, लेकिन दुर्भाग्य से सभी चार विकल्पों पर चर्चा नहीं की गई है):

  1. p=m/nnnN

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

    betareg(p ~ a+b+c, myData)
  3. लॉग प्रतिक्रिया को रूपांतरित करते हैं और रैखिक प्रतिगमन का उपयोग करते हैं। यह आमतौर पर सलाह नहीं दी जाती है।

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. एक द्विपद मॉडल को फिट करें, लेकिन फिर खाते में अधिक फैलाव लेने वाली मानक त्रुटियों की गणना करें। मानक त्रुटियों की गणना विभिन्न तरीकों से की जा सकती है:

    • (ए) के अतिव्यापी अनुमान ( एक , दो ) के माध्यम से मानक त्रुटियों को बढ़ाया । इसे "क्वैसी-बिनोमियल" जीएलएम कहा जाता है।

    • सैंडविच अनुमानक ( एक , दो , तीन , चार ) के माध्यम से (बी) मजबूत मानक त्रुटियां । इसे अर्थमिति में "फ्रैक्शनल लॉगिट" कहा जाता है।


    (ए) और (बी) एक समान नहीं हैं ( इस टिप्पणी को देखें , और इस पुस्तक में ३.४.१ और ३.४.२ खंड , और यह एसओ पोस्ट और यह भी एक और यह एक ), लेकिन इसी तरह के परिणाम देने के लिए करते हैं। विकल्प (ए) 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. प्रतिक्रिया के लॉग रूपांतरण का उपयोग करना:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. द्विपद मॉडल में अतिविशिष्टता के लिए लेखांकन। यह एक अलग चाल का उपयोग करता है: प्रत्येक डेटा बिंदु के लिए एक यादृच्छिक प्रभाव जोड़ना:

    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 बहुत समान अनुमान देते हैं और बहुत समान वाल्ड आत्मविश्वास अंतराल (साथ प्राप्त confint)। मैं # 3 का बहुत बड़ा प्रशंसक नहीं हूँ, क्योंकि यह एक तरह का धोखा है। और # 4 कुछ हद तक हैकी लगता है।

@Aaron को बहुत धन्यवाद, जिन्होंने अपनी टिप्पणी में मुझे # 3 और # 4 की ओर इशारा किया।


1
अच्छा जवाब, अच्छी तरह से समझाया और बिना किसी यादृच्छिक प्रभाव वाले मॉडल से जुड़ा। मैं # 3 (परिवर्तन) को धोखा नहीं कहूंगा, हालांकि इस तरह के विश्लेषणों में उन प्रकार के परिवर्तन बहुत आम हैं। मैं इसके बजाय कहता हूं कि दोनों # 3 और # 4 डेटा के वितरण के बारे में रिश्ते के बारे में धारणा बना रहे हैं, और इसलिए माध्य और विचरण के बीच संबंध के बारे में भी, और सिर्फ इसलिए कि # 4 पैमाने पर मॉडलिंग कर रहा है कि डेटा इसका मतलब यह नहीं था कि उन धारणाओं को बेहतर किया जा रहा है।
हारून ने

1
# 3 मानता है कि संभाव्यता का लॉग निरंतर विचरण के साथ सामान्य है, जबकि # 4 मानता है कि विचरण p (1-p) के समानुपाती है। फिट के अपने विवरण से, ये बहुत ज्यादा नहीं के समान प्रतीत होते हैं। और # 3 लगभग निश्चित रूप से अधिक मानक (आपके दर्शकों पर निर्भर करता है) इसलिए यदि निदान उचित है, तो वही होगा जो मैं पसंद करूंगा।
हारून ने

1
एक और संभावना है कि glmmTMB का उपयोग करें ; के साथ स्थापित करने के बाद devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB"), glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))काम करना चाहिए ...
बेन बोल्कर

@BenBolker धन्यवाद! क्या GlmmTMB (बीटा मॉडल के लिए) या इसके विपरीत glmmTMB को पसंद करने का कोई कारण है? क्या इनमें से एक पैकेज हाल ही में या अधिक सक्रिय रूप से विकसित हुआ है? इसके अलावा, क्या मैं यह पूछ सकता हूं कि इस उत्तर में सूचीबद्ध लोगों के बीच क्या दृष्टिकोण है - लॉजिनेट ट्रांसफॉर्मेशन के बाद गॉसियन ग्लम, बीटा ग्लम या द्विपद ग्लोम (1 | पंक्तिबद्ध) शब्द के साथ - क्या आप आमतौर पर बेहतर पाते हैं?
अमीबा का कहना है कि

1
मैं अगर संभव बीटा GLMM पसंद करते हैं - यह सांख्यिकीय मॉडल है कि है इरादा covariates / समूहों में अनुपात में परिवर्तन को मापने के। glmmTMBतेजी से और अधिक स्थिर है glmmADMB, और (थोड़ा) अधिक सक्रिय विकास के तहत, हालांकि परिपक्व नहीं है।
बेन बोल्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.