固定効果とランダム効果を持つ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パッケージのエクストラクター関数をチェックして、使用できないことを確認しました。助けてください!
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")
他の答えのいくつかは実行可能ですが、最良の答えは、このために設計されたアクセサメソッドを使用することだと主張します-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
##
> attributes(summary(study))$REmat
Groups Name Variance Std.Dev.
"Subject" "(Intercept)" "1378.18" "37.124"
"Residual" "" " 960.46" "30.991"
この答えは@Ben Bolkerのものに大きく基づいていますが、人々がこれに慣れていないので値を印刷するだけでなく(OPが望んでいたように)、自分で値を望んでいる場合は、次のように値を抽出できます:
VarCorr
オブジェクトをデータフレームに変換します。
re_dat = as.data.frame(VarCorr(study))
次に、個々の値にアクセスします。
int_vcov = re_dat[1,'vcov']
resid_vcov = re_dat[2,'vcov']
このメソッド(作成した日付フレームの行と列を指定)を使用して、必要な値にアクセスできます。