2017-01-20 14 views
0

を使用してマルチレベル回帰のスケールを修正する方法10カ国(レベル2)に300社(レベル1)のデータがあるとしましょう。レベル1の変数はPQとサイズです。レベル2変数は1人当たりGDPです。私はこれを実行するとlmer [R]

library(lme4) 

set.seed(1) 
PQ <- runif(300,7,21) 
id <- (1:300) 
country <- sample(1:10,300,replace=T) 
size <- sample(1:25000,300,replace=T) 
GDP <- sample(800:40000,10,replace=T) 
Country1 <- 1:10 
L1data <- as.data.frame(cbind(id,country,PQ,size)) 
L2data <- as.data.frame(cbind(Country1,GDP)) 
MLdata <- merge(L1data,L2data, by.x = "country", by.y = "Country1") 
dummymodel <- lmer(PQ ~ size + GDP + (size|country), data = MLdata, REML = F) 

私は警告メッセージに

警告メッセージを得る:1:一部の予測変数は非常に異なる スケールである:2を再スケーリング考えてみます。checkConv(ATTR(OPTでは、 "derivs" )、 opt $ par、ctrl = control $ checkConv、モデルは と収束しませんでしたmax | grad | = 1.77081(tol = 0.002、コンポーネント1)3: でcheckconv(attr(opt、 "derivs")、opt $ par、ctrl = control $ checkConv、:
モデルはほとんど識別できません:非常に大きな固有値 - 変数のサイズを変更しますか?モデルはほとんど識別できません:大きい固有値の比 - 変数のスケールを変更しますか?実際に

私は、元のデータでモデルを実行するとき、私は追加の警告メッセージが表示されます:

モデルが収束に失敗しました:1つの、負の固有値

と縮退ヘッセは私が推測しますこの問題を解決するために独立変数をスケーリングする必要があります。このようなマルチレベル回帰のスケールを変更する正しい方法は何ですか?この問題は、マルチレベルモデルの結果がスケーリングに依存するため、重要です。または私が見つけることができない他のいくつかの問題がありますか?

+0

すべての変数as.data.frame(scale(MLdata))をスケーリングした後、モデルが正しくフィットしました。 –

+0

ありがとうございます。これはマルチレベルでこのようなデータをスケールするのに理論的に有効ですか?各レベルで説明された結果と分散は、スケーリングのために大きな変化をもたらします。 –

答えて

2

tl; drモデルはほぼ同等の適合性を持っています。スケーリングされたモデルはわずかに優れており、より信頼性があります。固定効果はほぼ同等です。どちらのモデルも単変量効果分散分散共分散行列を推定するので、比較がずっと難しくなり、いずれの場合でもこれらのモデルに依存しないでください。

モデルは、センタリングおよびリスケーリング。以下に示すように、固定効果は本質的に同等です。分散共分散推定値は等価ですが、モデルはいずれにしても単数形です(つまり、正定値分散共分散行列に収まる十分な情報がない)ことを自分自身に確信させることは困難です。

あなたの例を使用し、スケーリングされたパラメータを指定して再実行している:

MLdata <- transform(MLdata, 
    size_cs=scale(size), 
    GDP_cs=scale(GDP)) 
m2 <- lmer(PQ ~ size_cs + GDP_cs + (size_cs|country), data = MLdata, 
        REML = FALSE) 

比較対数尤度:

logLik(dummymodel) ## -828.4349 
logLik(m2)   ## -828.4067 

これは、モデルがかなり接近していることを示唆しているが、スケールモデルが行っています(0.03対数尤度ユニットの改善は非常に小さいが)。

固定効果は異なるを見て、私は、彼らは同等だということを示してするつもりです:

fixef(dummymodel) 
## (Intercept)   size   GDP 
## 1.345754e+01 3.706393e-05 -5.464550e-06 
##  fixef(m2) 
## (Intercept)  size_cs  GDP_cs 
## 13.86155940 0.27300688 -0.05914308 

あなたは両方のモデルのためにcoef(summary(.))を見れば(、あなたがそのT-が表示されますsizeGDPの統計はほぼ同じです。this question

rescale.coefs <- function(beta,mu,sigma) { 
    beta2 <- beta ## inherit names etc. 
    ## parameters other than intercept: 
    beta2[-1] <- sigma[1]*beta[-1]/sigma[-1] 
    ## intercept: 
    beta2[1] <- sigma[1]*beta[1]+mu[1]-sum(beta2[-1]*mu[-1]) 
    return(beta2) 
}  
cm <- sapply(MLdata[c("size","GDP")],mean) 
csd <- sapply(MLdata[c("size","GDP")],sd) 

rescaled <- rescale.coefs(fixef(m2),mu=c(0,cm),sigma=c(1,csd)) 
all.equal(rescaled,fixef(m2)) 
cbind(fixef(dummymodel),rescaled) 
##        rescaled 
## (Intercept) 1.345754e+01 1.345833e+01 
## size   3.706393e-05 3.713062e-05 
## GDP   -5.464550e-06 -5.435151e-06 

非常に類似したから)

。分散共分散行列に関して

VarCorr(dummymodel) 
## Groups Name  Std.Dev. Corr 
## country (Intercept) 2.3420e-01  
##   size  1.5874e-05 -1.000 
## Residual    3.8267e+00 

VarCorr(m2) 
## Groups Name  Std.Dev. Corr 
## country (Intercept) 0.0000e+00  
##   size_cs  4.7463e-08 NaN 
## Residual    3.8283e+00  

どちらの分散共分散行列が正定値です。第1のものは国間の勾配の変動に完全に相関する国間の傍受の変化を有し、第2のものは国間の迎撃にゼロの分散を割り当てる。さらに、国間変動は、どちらの場合でも残差に対して非常に小さい。 両方の行列が正の定理であるならば、ある事例から他の事例に拡大縮小する変換を見つけることができます(各要素に(s_i s_j)を掛けることになります。与えられた予測子)。彼らはPDではないとき、それはトリッキーになります。

関連する問題