Как подобрать смешанную модель с переменной отклика от 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
@ Аарон: я попытался добавить + (1 | rowid)к своему вызову glmer, и это дает стабильные оценки и стабильные доверительные интервалы, независимо от моего выбора веса (я пробовал 100 и 500). Я также попытался запустить lmer на logit (reportsProbability), и я получил почти точно то же самое. Таким образом, оба решения работают хорошо! Бета-версия MM с glmmadmb также дает очень близкие результаты, но по какой-то причине не может полностью сходиться и работает вечно. Подумайте о том, чтобы опубликовать ответ, перечисляющий эти варианты и объяснив немного различия и плюсы / минусы! (Все доверительные интервалы, о которых я упоминаю, - это Вальд.)
говорит амеба «Восстановите Монику

1
И они абсолютно уверены в своей ценности, такой как 0,9, или у них также есть некоторый «предел погрешности»? Можете ли вы предположить, что уверенность, о которой сообщают разные субъекты, одинаково точна?

Ответы:


21

Имеет смысл начать с более простого случая отсутствия случайных эффектов.

Существует четыре способа справиться с непрерывной переменной ответа «ноль к одному», которая ведет себя как дробь или вероятность ( это наша самая каноническая / просматриваемая / просматриваемая ветка по этой теме, но, к сожалению, здесь не все четыре варианта обсуждаются):

  1. пзнак равном/NNnN

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

    betareg(p ~ a+b+c, myData)
  3. Логите преобразование ответа и используйте линейную регрессию. Обычно это не рекомендуется.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. Подберите биномиальную модель, но затем рассчитайте стандартные ошибки с учетом чрезмерной дисперсии. Стандартные ошибки могут быть вычислены различными способами:

    • (а) масштабированные стандартные ошибки с помощью оценки избыточной дисперсии ( один , два ). Это называется "квазибиномиальным" GLM.

    • (б) устойчивые стандартные ошибки с помощью сэндвич-оценки ( один , два , три , четыре ). Это называется «дробный логит» в эконометрике.


    (A) и (b) не являются идентичными (см. Этот комментарий и разделы 3.4.1 и 3.4.2 в этой книге , и этот пост SO, а также этот и этот ), но, как правило, дают схожие результаты. Вариант (а) реализован 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 предполагает, что дисперсия пропорциональна р (1-р). Из вашего описания соответствия, они кажутся достаточно похожими, чтобы не иметь большого значения. И № 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 после логит-преобразования, бета-glmm или биномиальный glmm с термином (1 | rowid) - вы считаете в целом более предпочтительным?
говорит амеба, восстанови Монику

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