SAS PROC GLIMMIXが二項glmmに対してglmer(lme4)とは非常に異なるランダムな勾配を与えるのはなぜですか


12

私はRに精通しているユーザーであり、4つの生息地変数について5年間で約35人のランダムな勾配(選択係数)を推定しようとしています。応答変数は、場所が「使用済み」(1)または「使用可能」(0)の生息地(以下「使用」)であったかどうかです。

Windows 64ビットコンピューターを使用しています。

Rバージョン3.1.0では、以下のデータと式を使用します。PS、TH、RS、およびHWは固定効果です(標準化された、測定された生息地までの距離)。lme4 V 1.1-7。

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmerは、私にとって意味のある固定効果のパラメーター推定値を提供します。また、データを定性的に調査するときに、ランダムな勾配(各生息地タイプに対する選択係数として解釈します)も意味があります。モデルの対数尤度は-3050.8です。

ただし、動物の生態学のほとんどの研究ではRを使用しません。動物の位置データを使用すると、空間的自己相関により標準エラーがタイプIエラーになりやすいためです。Rはモデルベースの標準誤差を使用しますが、経験的(またHuber-whiteまたはサンドイッチ)標準誤差が優先されます。

Rは現在このオプションを提供していませんが(私の知る限り-私が間違っている場合は修正してください)、SASは-SASにアクセスできませんが、同僚が標準エラーを判断するために自分のコンピューターを借りることに同意しました経験的方法を使用すると大幅に変化します。

まず、モデルベースの標準エラーを使用する場合、SASがRと同様の推定値を生成するようにします。これにより、モデルが両方のプログラムで同じ方法で指定されていることを確認できます。それらがまったく同じであるかどうかは気にしません-ちょうど似ています。試しました(SAS V 9.2):

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

行を追加するなど、他のさまざまな形式も試しました

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

指定せずに試した

solution type = UN,

またはコメントアウト

ddfm=betwithin;

モデルをどのように指定しても(多くの方法を試してみました)、固定効果が十分に類似していても、SASのランダムな勾配をRからの出力にリモートで類似させることはできません。そして、私が異なることを意味するとき、私はサインさえ同じではないことを意味します。SASの-2対数尤度は71344.94でした。

完全なデータセットをアップロードできません。そのため、3人の個人のレコードのみでおもちゃのデータセットを作成しました。SASは、数分で出力を提供します。Rでは1時間以上かかります。奇妙な。このおもちゃのデータセットを使用して、固定効果のさまざまな推定値を取得しています。

私の質問:ランダムな勾配の推定値がRとSASで非常に異なる可能性がある理由を誰かが明らかにできますか?呼び出しが同様の結果を生成するようにコードを変更するために、RまたはSASでできることはありますか?Rの推定値を「信じる」ため、SASのコードを変更したいです。

私は本当にこれらの違いに関心があり、この問題の根底に到達したいです!

RおよびSASの完全なデータセットの35人のうち3人のみを使用する玩具データセットからの出力は、jpegとして含まれています。

R出力 SAS出力1 SAS出力2 SAS出力3


編集と更新:

@JakeWestfallが発見を助けたように、SASの勾配には固定効果が含まれていません。固定効果を追加すると、結果は次のようになります。プログラム間で1つの固定効果「PS」のR勾配とSAS勾配を比較します(選択係数=ランダム勾配)。SASのバリエーションの増加に注意してください。

PSとRとSAS


これIDはRの要因ではないことに気付きました。それが何かを変更するかどうかを確認してください。
アーロンは

対数尤度のラプラス近似を使用して、両方に適合していることがわかります。それぞれの対数尤度スコアは何ですか?
usεr11852は回復モニック言う

1
同じ方向で従属変数をモデリングしていることを確認しましたか?
ピーターフロム-モニカの復職

1
ところで、ピーターが取得しているのは、デフォルトで0sおよび1s としてラベル付けされた二項データを使用してR、「1」応答の確率をモデル化し、SASが「0」応答の確率をモデル化することです。SASモデルを "1"の確率にするには、応答変数をとして記述する必要がありますuse(event='1')。もちろん、これを行わなくても、ランダム効果の分散の同じ推定値と、符号が反転していても同じ固定効果の推定値を期待する必要があります。
ジェイクウェストフォール14

1
@EricaN思い出したことの1つは、Rからのランダム効果をSAS ranef()ではなく、関数を使用してSASのランダム効果と比較する必要があるということですcoef()。前者は実際の変量効果を与え、後者は変量効果と固定効果ベクトルを与えます。したがって、これはあなたの投稿に示されている数字が異なる理由の多くを説明していますが、まだ完全には説明できないかなりの不一致が残っています。
ジェイクウェストフォール14

回答:


11

それは、彼らの論文ではZhangら、2011年によると、私はランダムな傾斜がパッケージ間の類似することが期待されているべきではないと思われるさまざまな統計パッケージを使用してバイナリ応答のために一般化線形混合効果モデルのフィッティングに、彼らは説明します。

概要:

一般化線形混合効果モデル(GLMM)は、断面データのモデルを長期的な設定に拡張するための一般的なパラダイムです。バイナリ応答のモデリングに適用すると、異なるソフトウェアパッケージ、およびパッケージ内の異なる手順でさえ、まったく異なる結果をもたらす場合があります。このレポートでは、これらのさまざまな手順の基礎となる統計的アプローチについて説明し、相関バイナリ応答に適合させる場合の長所と短所について説明します。次に、いくつかの一般的なソフトウェアパッケージに実装されたこれらの手順をシミュレートされた実際の研究データに適用することにより、これらの考慮事項を示します。私たちのシミュレーション結果は、考慮されているほとんどの手順の信頼性の欠如を示しており、実際にそのような人気のあるソフトウェアパッケージを適用するために重要な意味を持ちます。

@BenBolkerとチームが、私の質問をRの投票と見なし、いくつかのランダムな勾配項を持つモデルの経験的標準誤差とGauss-Hermite Quadrature機能をglmerに組み込むことを願っています。そのプログラムのさらなる分析。幸いなことに、RとSASにはランダムな勾配の比較可能な値はありませんが、全体的な傾向は同じです。ご意見をお寄せいただきありがとうございます。これに費やした時間と配慮に本当に感謝しています。


申し訳ありませんが、「標準標準エラー」とは何ですか?分散成分の標準誤差を意味しますか?または、サンドイッチ標準エラーを意味しますか?
ベンボルカー

申し訳ありません...経験的/サンドイッチSEを意味しました。返信を編集しました。
ノヴァ14年

@BenBolkerこれは組み込まれましたか?
Lepidopterist

いや。私はそれが技術的に私の研究プログラムの一部ではありませんので、...、私はこのような支援開発するつもりだ方法を把握しようとし続ける
ベンBolker

4

回答と解説/その他の質問の組み合わせ:

「おもちゃ」データセットに3つの異なるオプティマイザーの選択肢を合わせました。(*注1:グループ化変数をサブサンプリングするよりも、毎年とid内からサブサンプリングすることで小さなデータセットを作成する方が、比較目的でおそらくより有用でしょう。実際、GLMMは実行されないことがわかっていますこのような少数のグループ化変数レベルでは特にうまくいきます。

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

バッチ調整コード:

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

次に、新しいセッションで結果を読み取りました。

load("Newton_batch.RData")
library(lme4)

経過時間と逸脱:

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

これらの逸脱は、RからのOPで報告された逸脱(6101.7)よりもかなり低く、SASからのOPで報告された逸脱(6078.9)をわずかに下回っていますが、パッケージ全体で逸脱を比較することは必ずしも賢明ではありません。

SASが約100の関数評価に収束したことに本当に驚きました!

時間はMacbook Proで17分(nloptwrap)から80分(bobyqa)の範囲で、OPのエクスペリエンスと一致しています。逸脱はの方が少し良いですnloptwrap

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

nloptwrap標準エラーはかなり大きいものの、答えはかなり異なって見えます...

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(ここのコードyear:idは、追跡する必要があるという警告を示します)

つづく ... ?


完全なデータセットを送信した方が便利でしょうか?唯一の問題は、データセット全体で収束に約9時間かかることです。そのため、サンプリングに関する提案は適切です。対数変換でデータを変換しようとしましたが、ビン化された残差プロットはまだtheいです-残差プロットはこれらのデータの問題の一部を説明すると思いますか?最後に-SASでの結果はRに似ていましたか?
ノヴァ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.