web-dev-qa-db-ja.com

lme4 merモデルオブジェクトからランダム効果分散を抽出

固定効果とランダム効果を持つmerオブジェクトがあります。変量効果の分散推定値を抽出するにはどうすればよいですか?これが私の質問の簡略版です。

study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
study

これにより長い出力が得られます-この場合は長すぎません。とにかく、どのように明示的に選択するのですか

Random effects:
Groups   Name        Variance Std.Dev.
Subject  (Intercept) 1378.18  37.124  
Residual              960.46  30.991  

出力の一部?値そのものが欲しい。

私は長い間見てきました

str(study)

そこには何もありません!また、lme4パッケージのエクストラクター関数をチェックして、使用できないことを確認しました。助けてください!

40
dynamo

lmerはS4オブジェクトを返すため、これは機能するはずです。

remat <- summary(study)@REmat
print(remat, quote=FALSE)

どの印刷:

 Groups   Name        Variance Std.Dev.
 Subject  (Intercept) 1378.18  37.124  
 Residual              960.46  30.991  

...一般的に、「mer」オブジェクトのprintおよびsummaryメソッドのソースを見ることができます。

class(study) # mer
selectMethod("print", "mer")
selectMethod("summary", "mer")
14
Tommy

他の答えのいくつかは実行可能ですが、最良の答えは、このために設計されたアクセサメソッドを使用することだと主張します-VarCorr(これはlme4の前身であるnlmeパッケージと同じです)。

[〜#〜] update [〜#〜]lme4の最近のバージョン(バージョン1.1-7、ただし以下のすべてはおそらくバージョン> = 1.0に適用可能)、VarCorrはより柔軟です以前よりも、フィッティングされたモデルオブジェクト内での釣りに頼ることなく、必要なすべてを実行する必要があります。

library(lme4)
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
VarCorr(study)
##  Groups   Name        Std.Dev.
##  Subject  (Intercept) 37.124  
##  Residual             30.991

デフォルトでは、VarCorr()は標準偏差を出力しますが、必要に応じて代わりに分散を取得できます。

print(VarCorr(study),comp="Variance")
##  Groups   Name        Variance
##  Subject  (Intercept) 1378.18 
##  Residual              960.46 

comp=c("Variance","Std.Dev.")は両方を出力します)。

柔軟性を高めるために、as.data.frameメソッドを使用してVarCorrオブジェクトを変換し、グループ化変数、効果変数、および分散/共分散または標準偏差/相関を与えることができます。

as.data.frame(VarCorr(study))
##        grp        var1 var2      vcov    sdcor
## 1  Subject (Intercept) <NA> 1378.1785 37.12383
## 2 Residual        <NA> <NA>  960.4566 30.99123

最後に、VarCorrオブジェクトの生の形式(必要がない場合はおそらく混乱させないでください)は、標準偏差をエンコードする追加(冗長)情報を持つ分散共分散行列のリストです。相関、および残差標準偏差を与え、モデルに推定スケールパラメーター("sc")があるかどうかを指定する属性("useSc")。

unclass(VarCorr(fm1))
## $Subject
##             (Intercept)      Days
## (Intercept)  612.089748  9.604335
## Days           9.604335 35.071662
## attr(,"stddev")
## (Intercept)        Days 
##   24.740448    5.922133 
## attr(,"correlation")
##             (Intercept)       Days
## (Intercept)  1.00000000 0.06555134
## Days         0.06555134 1.00000000
## 
## attr(,"sc")
## [1] 25.59182
## attr(,"useSc")
## [1] TRUE
## 
72
Ben Bolker
> attributes(summary(study))$REmat
 Groups     Name          Variance  Std.Dev.
 "Subject"  "(Intercept)" "1378.18" "37.124"
 "Residual" ""            " 960.46" "30.991"
5
John Colby

この答えは@Ben Bolkerのものに大きく基づいていますが、人々がこれに慣れていないので値を印刷するだけでなく(OPが望んでいたように)、自分で値を望んでいる場合は、次のように値を抽出できます:

VarCorrオブジェクトをデータフレームに変換します。

re_dat = as.data.frame(VarCorr(study))

次に、個々の値にアクセスします。

int_vcov = re_dat[1,'vcov']
resid_vcov = re_dat[2,'vcov']

このメソッド(作成した日付フレームの行と列を指定)を使用して、必要な値にアクセスできます。

0
arranjdavis