応答変数が0〜1の混合モデルを適合させる方法は?


15

私はlme4::glmer()、バイナリではなく、0と1の間の連続変数である従属変数を使用して、二項一般化混合モデル(GLMM)を近似しようとしています。この変数は確率と考えることができます。実際、それ人間の被験者によって報告された確率です(私は分析に役立つ実験で)。すなわち、それはだない「離散」割合が、連続変数。

私のglmer()予想通りの呼び出しは(下記参照)は動作しません。どうして?私に何ができる?

後で編集:以下の私の答えは、この質問の元のバージョンよりも一般的であるため、質問もより一般的なものに変更しました。


詳細

明らかに、バイナリDVだけでなく、0と1の間の連続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?それはglmerを使用するよりも私の好みです。または、ハックソリューションで、各観測値にランダム効果を追加して、重みの選択による分散不足を説明することもできます。
アーロン-モニカの復活

ありがとう。はい、DVにログインしてからGaussian混合モデル(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)グラマーコールに追加しようとしましたが、これにより、体重の選択に関係なく、安定した推定値と安定した信頼区間が得られました(100と500を試しました)。また、logit(reportedProbability)でlmerを実行してみたところ、ほぼ同じ結果が得られました。したがって、両方のソリューションがうまくいくようです!glmmadmbを使用したBeta MMでも非常に近い結果が得られますが、何らかの理由で完全に収束できず、実行に永遠に時間がかかります。これらのオプションをリストし、相違点と長所/短所を少し説明する回答を投稿することを検討してください!(言及した信頼区間はすべてWaldです。)
amoebaはReinstate Monicaを言います

1
そして、彼らは0.9のような値について絶対に確信していますか、それとも彼らはいくつかの「エラーマージン」を持っていますか?さまざまな被験者から報告された信頼度が同様に正確であると仮定できますか?

回答:


20

ランダム効果のない単純なケースから始めるのが理にかなっています。

分数または確率のように振る舞う連続的な0対1の応答変数を処理する方法は4つあります(これはこのトピックで最も正統な/賛成/閲覧されたスレッドですが、残念ながら4つのオプションすべてがそこで議論されているわけではありません):

  1. p=m/nnnN

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

    betareg(p ~ a+b+c, myData)
  3. Logitは応答を変換し、線形回帰を使用します。通常、これはお勧めしません。

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. 二項モデルを近似しますが、過剰分散を考慮して標準誤差を計算します。標準エラーはさまざまな方法で計算できます。

    • (a)過分散推定によるスケーリングされた標準誤差(onetwo)。これは「準二項」GLMと呼ばれます。

    • (b)サンドイッチ推定器による堅牢な標準誤差(onetwothreefour)。これは、計量​​経済学では「分数ロジット」と呼ばれます。


    ()と(b)は同一ではない(参照このコメントを、そして本書のセクション3.4.1と3.4.2、およびこのSOポスト、この1、この1)が、同様の結果が得られる傾向があります。オプション(a)はglm次のように実装されます。

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

同じ4つの方法がランダム効果で利用できます。

  1. weights引数を使用する(onetwo):

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

    上記の2番目のリンクによると、過剰分散をモデル化することをお勧めします。そこを参照してください(以下の#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"))

    応答データに正確なゼロまたは1が存在する場合、ゼロ/ 1膨張ベータモデルを使用できます。 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月):これは無効なアプローチである可能性があります。ここで議論を参照してください。これをさらに調査する必要があります。


私の特定の場合、オプション#1は使用できません。

オプション#2は非常に遅く、収束に問題があります:glmmadmb実行に5〜10分かかります(それでも収束しなかったと文句を言います!)が、一瞬でlmer動作しglmer、数秒かかります。 更新:glmmTMB @BenBolkerのコメントで示唆されているように試してみましたが、glmer収束の問題もなくほぼ同じ速度で動作します。これが私が使用するものです。

オプション#3と#4は、非常に類似した推定値と非常に類似したWald信頼区間を生成します(で取得confint)。私は#3の大ファンではありませんが、それは一種の不正行為です。そして、#4はややハックを感じます。

コメントで#3と#4を指摘してくれた@Aaronに感謝します。


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(ベータモデル用)よりも好む理由はありますか?これらのパッケージの1つはより最近ですか、またはより積極的に開発されていますか?それとは別に、この答えにリストされているもののうち、ロジット変換後のガウスグリム、ベータグリム、または(1 | rowid)項を含む二項グリムのどのアプローチを一般的にお勧めしますか?
アメーバは

1
可能であればベータGLMMを好みます- 共変量/グループ全体の割合の変化を測定すること目的とした統計モデルです。glmmTMBは、よりも高速で安定しておりglmmADMB、(やや)より活発な開発中ですが、それほど成熟していません。
ベンボルカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.