Як підібрати змішану модель із змінною відповіді між 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
Як щодо перетворення ймовірностей спочатку? Чи можете ви отримати щось, що ближче до нормально розподіленого, скажімо, перетворення logit? Або arcsin-sqrt? Це було б моїм перевагою, а не використанням glmer. Або у вашому рішенні для злому ви також можете спробувати додати випадковий ефект для кожного спостереження, щоб врахувати недостатність, обумовлену вибором ваги.
Аарон залишив стек переповнення

Спасибі. Так, я можу ввімкнути DV і потім використовувати змішану модель Гаусса (lmer), але це теж своєрідний злом, і я прочитав, що це не рекомендується. Я спробую випадковий ефект для кожного спостереження! На даний момент я пробую бета-змішану модель; lme4 не може впоратися з цим, але glmmadmb може. Коли я бігаю glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta"), я отримую правильний інтервал правильності та розумні довіри, але попередження про збій не вдалося : - / намагаюся зрозуміти, як збільшити кількість ітерацій. Бета-версія може працювати для мене, оскільки у мене немає DV = 0 або DV = 1 випадків.
Амеба каже: Відновити Моніку

Я не знаю про glmer, але для glm це може допомогти: stats.stackexchange.com/questions/164120/… :

1
@Aaron: Я спробував додати + (1 | rowid)до свого дзвінка glmer, і це дає стабільні оцінки та стабільні інтервали довіри, незалежно від мого вибору ваги (я пробував 100 та 500). Я також спробував запустити lmer на logit (поінформував про Probabability), і я отримав майже те саме. Тож обидва рішення, здається, працюють добре! Beta MM з glmmadmb дає також дуже близькі результати, але з певних причин не вдається повністю конвергуватися і потрібно вічно працювати. Поміркуйте над публікацією відповіді з переліком цих варіантів та трохи поясніть відмінності та плюси / мінуси! (Інтервали довіри, про які я згадую, - це всі Вальди.)
Амеба каже: Відновити Моніку

1
І вони абсолютно впевнені у їхньому значенні, як 0,9, чи вони також мають певну "похибку"? Чи можете ви припустити, що довіра, про яку повідомляють різні суб'єкти, однаково точна?

Відповіді:


21

Має сенс почати з більш простого випадку без випадкових ефектів.

Існує чотири способи боротьби з постійною змінною відповіді "нуль до одного", яка поводиться як дріб або ймовірність ( це наш найбільш канонічний / перетворений / переглянутий потік в цій темі, але, на жаль, не всі чотири варіанти там обговорюються):

  1. p=м/ннnN

    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. Встановіть біноміальну модель, але потім обчисліть стандартні помилки з урахуванням наддисперсії. Стандартні помилки можна обчислити різними способами:

    • (a) масштабовані стандартні помилки через оцінку перевищення ( один , два ). Це називається "квазібіноміальний" ГЛМ.

    • (b) надійні стандартні помилки через сендвіч-оцінювач ( один , два , три , чотири ). Це називається "дробовий логит" в економетрії.


    (А) та (б) не є тотожними (див. Цей коментар та розділи 3.4.1 та 3.4.2 у цій книзі , а також цю публікацію з ПП, а також цю та цю ), але, як правило, дають подібні результати. Варіант (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 перетворення відповіді:

    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 дають дуже схожі оцінки та дуже схожі інтервали довіри Wald (отримані з 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 перед glmmADMB (для бета-моделей) чи навпаки? Чи є один із цих пакетів останнім чи більш активно розвинутим? Окрім цього, чи можу я запитати, який підхід серед перелічених у цій відповіді - гаусовий glmm після перетворення logit, beta glmm або двочленний glmm з (1 | rowid) терміном - чи вважаєте ви загалом кращим?
амеба каже, що повернеться до Моніки

1
Я вважаю за краще бета-версію GLMM, якщо це можливо - це статистична модель, яка призначена для вимірювання змін пропорцій в межах коваріатів / груп. glmmTMBшвидше і стабільніше, ніж glmmADMBі (трохи) активніший розвиток, хоча і не такий зрілий.
Бен Болкер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.