11

Rで固定効果線形回帰を実行しようとしています。私のデータは次のようになります。

dte   yr   id   v1   v2
  .    .    .    .    .
  .    .    .    .    .
  .    .    .    .    .

次にyr、ファクターを作成して使用することで、これを行うことにしましたlm

lm(v1 ~ factor(yr) + v2 - 1, data = df)

ただし、これはメモリが不足しているようです。私のファクターには20のレベルがあり、df保存に約2GBかかる1400万行です。これは、このプロセス専用の22GBのマシンで実行しています。

次に、昔ながらの方法で試してみることにしました。次のようにして、各年のダミー変数を作成しt1ますt20

df$t1 <- 1*(df$yr==1)
df$t2 <- 1*(df$yr==2)
df$t3 <- 1*(df$yr==3)
...

単純に計算します。

solve(crossprod(x), crossprod(x,y))

これは問題なく実行され、ほぼすぐに答えが得られます。

係数をうまく計算できるときにメモリが不足するのは、lmについて特に興味がありますか?ありがとう。

4

5 に答える 5

10

これまでのところ、正しい方向を示した答えはありません。

@idrによって受け入れられた回答は、 と の間lmで混乱を招いていsummary.lmます。lm診断統計をまったく計算しません。代わりに、summary.lmそうします。だから彼は話しているsummary.lm.

@Jakeの答えは、QR 分解と LU/Choleksy 分解の数値安定性に関する事実です。Arvindakshanの回答は、両方の操作の背後にある浮動小数点操作の量を指摘することで、これを拡張します (ただし、彼が言ったように、行列の外積を計算するためのコストは考慮していません)。ただし、FLOP カウントとメモリ コストを混同しないでください。実際、どちらの方法も LINPACK / LAPACK でのメモリ使用量は同じです。具体的には、QR メソッドQは因子を格納するためにより多くの RAM を必要とするという彼の主張は、偽物です。lm()で説明されている圧縮されたストレージ: LINPACK / LAPACK の QR 分解によって返される qraux とは、 QR 因数分解がどのように計算され、格納されるかを明確にします。QR vs Chol の速度の問題については、私の回答で詳しく説明しています。Rで組み込みのlm関数が非常に遅いのはなぜですか? 、高速化lmに関する私の回答では、Choleksy 法を使用した小さなルーチンが提供されていますlm.chol。これは、QR 法よりも 3 倍高速です。

@Gregの回答/提案biglmは良いですが、質問には回答しません。が言及されているので、 QR 分解が と で異なることbiglmを指摘しておきます。結果の因子が正の対角線を持つように世帯主反射を計算します。詳細については、QR 分解によるコレスキー ファクターを参照してください。これを行う理由は、結果がコレスキー因子と同じになるためです。詳細については、QR 分解と Rのコレスキー分解を参照してください。また、 以外にも を使用できます。私の答えを読んでください:サイズ xx.x MB のベクトルをさらに割り当てることができないと予測してください。lmbiglmbiglmRbiglmRbiglmmgcvbiglm


要約の後、私の答えを投稿する時が来ました。

lm線形モデルを適合させるために、

  1. モデル フレームを生成します。
  2. モデル行列を生成します。
  3. lm.fitQR 因数分解の呼び出し。
  4. は、QR 分解の結果と のモデル フレームを返しますlmObject

5 列の入力データ フレームの保存には 2 GB のコストがかかるとおっしゃいました。因子レベルが 20 の場合、結果のモデル マトリックスには約 25 列があり、10 GB のストレージを使用します。を呼び出したときにメモリ使用量がどのように増加するかを見てみましょうlm

  • [グローバル環境]最初は、データ フレーム用に 2 GB のストレージがあります。
  • [lm環境]次に、モデル フレームにコピーされ、2 GB のコストがかかります。
  • [lm環境]次に、モデル マトリックスが生成され、10 GB のコストがかかります。
  • [lm.fit環境]モデル マトリックスのコピーが作成され、QR 分解によって上書きされ、10 GB のコストがかかります。
  • [lm環境]の結果lm.fitが返されます。コストは 10 GB です。
  • [グローバル環境]の結果はlm.fitによってさらに返されlm、さらに 10 GB のコストがかかります。
  • [グローバル環境]モデル フレームは によって返されlm、2 GB の費用がかかります。

したがって、合計 46 GB の RAM が必要であり、使用可能な 22 GB の RAM をはるかに超えています。

実際、lm.fitに「インライン化」できればlm、20 GB のコストを節約できます。しかし、R 関数を別の R 関数にインライン化する方法はありません。

周りで何が起こっているかを見るために、小さな例を取り上げることができるかもしれませんlm.fit:

X <- matrix(rnorm(30), 10, 3)    # a `10 * 3` model matrix
y <- rnorm(10)    ## response vector

tracemem(X)
# [1] "<0xa5e5ed0>"

qrfit <- lm.fit(X, y)
# tracemem[0xa5e5ed0 -> 0xa1fba88]: lm.fit 

実際、Xに渡されるとコピーされlm.fitます。qrfit持っているものを見てみましょう

str(qrfit)
#List of 8
# $ coefficients : Named num [1:3] 0.164 0.716 -0.912
#  ..- attr(*, "names")= chr [1:3] "x1" "x2" "x3"
# $ residuals    : num [1:10] 0.4 -0.251 0.8 -0.966 -0.186 ...
# $ effects      : Named num [1:10] -1.172 0.169 1.421 -1.307 -0.432 ...
#  ..- attr(*, "names")= chr [1:10] "x1" "x2" "x3" "" ...
# $ rank         : int 3
# $ fitted.values: num [1:10] -0.466 -0.449 -0.262 -1.236 0.578 ...
# $ assign       : NULL
# $ qr           :List of 5
#  ..$ qr   : num [1:10, 1:3] -1.838 -0.23 0.204 -0.199 0.647 ...
#  ..$ qraux: num [1:3] 1.13 1.12 1.4
#  ..$ pivot: int [1:3] 1 2 3
#  ..$ tol  : num 1e-07
#  ..$ rank : int 3
#  ..- attr(*, "class")= chr "qr"
# $ df.residual  : int 7

コンパクトな QR 行列qrfit$qr$qrはモデル行列と同じ大きさであることに注意してくださいX。内部lm.fitで作成されますが、終了時にlm.fitコピーされます。したがって、合計で、次の 3 つの「コピー」が作成されXます。

  • グローバル環境の元のもの。
  • にコピーされたものlm.fit、QR 因数分解によって上書きされたもの。
  • によって返されたものlm.fit

あなたの場合は 10 GB であるため、単独でX関連するメモリ コストはすでに 30 GB です。lm.fitに関連するその他のコストは言うまでもありませんlm


一方、見てみましょう

solve(crossprod(X), crossprod(X,y))

X10 GB かかりますが、これcrossprod(X)は単なる25 * 25行列でありcrossprod(X,y)、長さ 25 のベクトルです。に比べて非常に小さいためX、メモリ使用量はまったく増加しません。

が呼び出さXれたときにのローカル コピーが作成されるのではないかと心配しているかもしれません。crossprod全くない!lm.fitに対して読み取りと書き込みの両方を実行するとは異なりXcrossprod読み取りのみを実行Xするため、コピーは作成されません。おもちゃの行列でこれを確認するには、次のようにしますX

tracemem(X)
crossprod(X)

コピーのメッセージは表示されません。


上記のすべての短い要約が必要な場合は、次のとおりです。

  • lm.fit(X, y)(または)のメモリ コスト.lm.fit(X, y)は、 の 3 倍ですsolve(crossprod(X), crossprod(X,y))
  • モデル マトリックスがモデル フレームよりどれだけ大きいかに応じて、 のメモリ コストlmは の 3 ~ 6 倍になりsolve(crossprod(X), crossprod(X,y))ます。下限 3 には到達しませんが、モデル マトリックスがモデル フレームと同じ場合、上限 6 に到達します。bs()これは、やなどの因子変数や「因子に類似した」項がない場合に当てはまりますpoly()
于 2016-09-04T17:43:49.643 に答える
10

イドリスが言ったことに加えて、質問で示したような正規方程式を使用して lm() がパラメーターを解決するのではなく、効率は劣りますがより数値的に正確になる傾向がある QR 分解を使用することも指摘する価値があります。ソリューション。

于 2012-04-26T08:12:39.867 に答える
9

biglmパッケージの使用を検討することをお勧めします。より小さなデータのチャンクを使用して、lm モデルに適合します。

于 2012-04-26T13:33:08.433 に答える
7

lmは、入力フィーチャの係数を見つけるだけではありません。たとえば、各独立変数の標準誤差や t 値など、独立変数の係数について詳しく説明する診断統計を提供します。

回帰を実行して回帰の有効性を理解する際には、これらの診断統計を理解することが重要だと思います。

これらの追加の計算lmは、単純に回帰の行列方程式を解くよりも遅くなります。

たとえば、mtcarsデータセットを使用すると、次のようになります。

>data(mtcars)
>lm_cars <- lm(mpg~., data=mtcars)
>summary(lm_cars)

Call:                                                         
lm(formula = mpg ~ ., data = mtcars)                          

Residuals:                                                    
    Min      1Q  Median      3Q     Max                       
-3.4506 -1.6044 -0.1196  1.2193  4.6271                       

Coefficients:                                                 
            Estimate Std. Error t value Pr(>|t|)              
(Intercept) 12.30337   18.71788   0.657   0.5181              
cyl         -0.11144    1.04502  -0.107   0.9161              
disp         0.01334    0.01786   0.747   0.4635              
hp          -0.02148    0.02177  -0.987   0.3350              
drat         0.78711    1.63537   0.481   0.6353              
wt          -3.71530    1.89441  -1.961   0.0633 .            
qsec         0.82104    0.73084   1.123   0.2739              
vs           0.31776    2.10451   0.151   0.8814              
am           2.52023    2.05665   1.225   0.2340              
gear         0.65541    1.49326   0.439   0.6652              
carb        -0.19942    0.82875  -0.241   0.8122              
---                                                           
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.65 on 21 degrees of freedom        
Multiple R-squared: 0.869,      Adjusted R-squared: 0.8066    
F-statistic: 13.93 on 10 and 21 DF,  p-value: 3.793e-07       
于 2012-04-26T04:48:23.020 に答える
5

ジェイクのポイントを詳しく説明します。回帰が解決しようとしているとしましょう: y = Ax( A は計画行列です )。m 個の観測値と n 個の独立変数を使用すると、A は mxn 行列になります。この場合、QR のコストは ~m*n^2です。あなたの場合、 m = 14x10^6 と n = 20 のように見えます。そのm*n^2 = 14*10^6*400ため、かなりのコストがかかります。

ただし、正規方程式では、反転しようとしていますA'A(' 転置を示します)。これは正方形でサイズはnxnです。解決は、通常、コストがかかる LU を使用して行われますn^3 = 8000。これは、QR の計算コストよりもはるかに小さいです。もちろん、これには行列乗算のコストは含まれません。

さらに、QR ルーチンがサイズ (!) の Q 行列を格納しようとするとmxm=14^2*10^12、メモリが不足します。この問題が発生しないように QR を書き込むことは可能です。QR のどのバージョンが実際に使用されているかを知ることは興味深いでしょう。そして、なぜlm呼び出しがメモリ不足になるのか。

于 2012-08-12T19:58:21.487 に答える