4

used lm()Rの複数(〜100万)の応答変数に対して、複数の回帰モデルを適合させる必要があります。

allModels <- lm(t(responseVariablesMatrix) ~ modelMatrix)

これは、すべてのモデルを含む巨大なオブジェクトのようなクラス「mlm」のオブジェクトを返します。関数を使用して実行できる各モデルの最初の係数のt 統計を取得したいのですがsummary(allModels)、この大きなデータでは非常に遅く、多くの不要な情報も返します。

関数t-statisticを使用するよりも高速である可能性がある、手動で計算するより高速な方法はありますかsummary()

ありがとう!

4

1 に答える 1

1

summary.lm() 関数をハックして、必要なビットだけを取得し、残りを残すことができます。

あなたが持っている場合

nVariables <- 5
nObs <- 15

y <- rnorm(nObs)
x <- matrix(rnorm(nVariables*nObs),nrow=nObs)

allModels <-lm(y~x)

次に、これは lm.summary() 関数からのコードですが、余分な荷物はすべて削除されています (エラー処理もすべて削除されていることに注意してください)。

p <- allModels$rank
rdf <- allModels$df.residual
Qr <- allModels$qr
n <- NROW(Qr$qr)
p1 <- 1L:p
r <- allModels$residuals
f <- allModels$fitted.values
w <- allModels$weights
mss <- if (attr(allModels$terms, "intercept")) 
sum((f - mean(f))^2) else sum(f^2)
rss <- sum(r^2)
resvar <- rss/rdf
R <- chol2inv(Qr$qr[p1, p1, drop = FALSE])
se <- sqrt(diag(R) * resvar)
est <- allModels$coefficients[Qr$pivot[p1]]
tval <- est/se

tvalによっても与えられるように、t 統計のベクトルになりました。

summary(allModels)$coefficients[,3]

大きなモデルに問題がある場合は、コードを書き直して、複数の行/割り当てをより少ない行にまとめることで、より少ないオブジェクトを保持するようにすることができます。

私が知っているハッキーな解決策。しかし、それは可能な限り高速になります。コードのすべての行も関数に入れる方がきれいだと思います。

于 2013-05-16T02:05:33.167 に答える