mi
パッケージの過去2〜3年のうちのいくつかの時点でかなり大きな書き換えが行われているようです。miパッケージを使用して帰属ランダム効果モデル推定値をプールすることはできますか?
物事の「古い」方法は、次のチュートリアルではよく概説である:(リーパーのシミュレーションデモにこだわっ)物事のhttp://thomasleeper.com/Rcourse/Tutorials/mi.html
「新しい」方法は、次のようになります。
関数名は変更されていますが、これは実際には "古い"方法と似ています。
(私の見晴らしから)最大の変化は、以下の "古い" の機能の代替
lm.mi(formula, mi.object, ...)
glm.mi(formula, mi.object, family = gaussian, ...)
bayesglm.mi(formula, mi.object, family = gaussian, ...)
polr.mi(formula, mi.object, ...)
bayespolr.mi(formula, mi.object, ...)
lmer.mi(formula, mi.object, rescale=FALSE, ...)
glmer.mi(formula, mi.object, family = gaussian, rescale=FALSE, ...)
。
以前は、これらの関数のいずれかを使用して帰属データセットごとにモデルを計算し、結果をmi.pooled()
(またはLeeerの例に従えばcoef.mi()
)を使用してプールすることができました。
現在のバージョンmi
(私はv1.0がインストールされています)では、これらの最後のステップが1つの関数pool()
に結合されているようです。 pool()
関数は、上記の代入プロセス中に変数に割り当てられたファミリとリンク関数を読み取って、bayesglm
のモデルを次のように推定します。
# run models on imputed data and pool the results
summary(pool(y ~ x1 + x2, mydf_imp))
##
## Call:
## pool(formula = y ~ x1 + x2, data = mydf_imp)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.98754 -0.40923 0.03393 0.46734 2.13848
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.34711 0.25979 -1.336 0.215
## x1 2.07806 0.08738 23.783 1.46e-13 ***
## x2 19.90544 0.11068 179.844 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.7896688)
##
## Null deviance: 38594.916 on 99 degrees of freedom
## Residual deviance: 76.598 on 97 degrees of freedom
## AIC: 264.74
##
## Number of Fisher Scoring iterations: 7
これは、模擬ベータ値(2と20)の回復に近づいているようです。つまり、期待通りに動作しています。
グループ化変数を取得するために、ちょっとしたシミュレーションをランダムに実行してみましょう。 missing_data.frame()
ので
mydf2 <- data.frame(x1 = rep(runif(100, 0, 5), 20)
,x2 = rep(rnorm(100, 0, 2.5), 20)
,group_var = rep(1:20, each = 100)
,noise = rep(rnorm(100), 20))
mydf2$y <- 2*mydf2$x1 + 20*mydf2$x2 + mydf2$noise
mydf2$x1[sample(1:nrow(mydf2), 200, FALSE)] <- NA
mydf2$x2[sample(1:nrow(mydf2), 100, FALSE)] <- NA
# Convert to a missing_data.frame
mydf2_mdf <- missing_data.frame(mydf2)
show(mydf2_mdf)
## Object of class missing_data.frame with 2000 observations on 5 variables
##
## There are 4 missing data patterns
##
## Append '@patterns' to this missing_data.frame to access the corresponding pattern for every observation or perhaps use table()
##
## type missing method model
## x1 continuous 200 ppd linear
## x2 continuous 100 ppd linear
## group_var continuous 0 <NA> <NA>
## noise continuous 0 <NA> <NA>
## y continuous 0 <NA> <NA>
##
## family link transformation
## x1 gaussian identity standardize
## x2 gaussian identity standardize
## group_var <NA> <NA> standardize
## noise <NA> <NA> standardize
## y <NA> <NA> standardize
私が「順不同カテゴリ」の"un"
に再割り当てした後、上記のように進行するmi
からchange()
関数を使用し、連続としてgroup_var
をintepretingているように見えます。バージョンmi
の1.0以前のバージョン(lmer.mi
とglmer.mi
で利用可能、すなわち機能)の機能を削除していない限り
mydf2_mdf <- change(mydf2_mdf, y = "group_var", what = "type", to = "un" )
# impute
mydf2_imp <- mi(mydf2_mdf)
ここで、Iは、式中のランダム効果の添加が適切にpool()
を指すべきであることを前提となりますlme4
機能。しかし、初期のエラーメッセージは、これが当てはまらないことを示唆しています。
# run models on imputed data and pool the results
summary(pool(y ~ x1 + x2 + (1|group_var), mydf2_imp))
## Warning in Ops.factor(1, group_var): '|' not meaningful for factors
## Warning in Ops.factor(1, group_var): '|' not meaningful for factors
## Error in if (prior.scale[j] < min.prior.scale) {: missing value where TRUE/FALSE needed
私の警告メッセージに続いて、私の因子のうちの整数を抽出する私に見積もりを取得しているが、結果はpool()
はまだbayesglm
で固定効果モデルを推定し、私試みたランダム効果を一定に保持していることを示唆しています。
summary(pool(y ~ x1 + x2 + (1|as.numeric(as.character(group_var))), mydf2_imp))
##
## Call:
## pool(formula = y ~ x1 + x2 + (1 | as.numeric(as.character(group_var))),
## data = mydf2_imp)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.93633 -0.69923 0.01073 0.56752 2.12167
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 1.383e-01 2.596e+02 0.001
## x1 1.995e+00 1.463e-02 136.288
## x2 2.000e+01 8.004e-03 2499.077
## 1 | as.numeric(as.character(group_var))TRUE -3.105e-08 2.596e+02 0.000
## Pr(>|t|)
## (Intercept) 1
## x1 <2e-16 ***
## x2 <2e-16 ***
## 1 | as.numeric(as.character(group_var))TRUE 1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.8586836)
##
## Null deviance: 5384205.2 on 1999 degrees of freedom
## Residual deviance: 1713.9 on 1996 degrees of freedom
## AIC: 5377
##
## Number of Fisher Scoring iterations: 4
私の質問はありますか?A:はい場合
- は、それが簡単に
mi
を使用してプールされたランダム効果推定値を生成することができる、と - 、どのように?
ありがとう! @ベン - グッドリッチ、任意の効果を組み合わせる方法についてのアドバイス?そこにも適切な意味がありますか? – joemienko
確かに: 'rowMeans(sapply(estimate、FUN = function(x)unlist(ranef(x))))' –