web-dev-qa-db-ja.com

RStudioで「保護スタックオーバーフロー」の問題を解決する方法

Glmnetパッケージを使用してモデルを構築しようとしていますが、次の行を実行すると次のエラーが発生します。

#library('glmnet')
x = model.matrix(response ~ ., data = acgh_frame[,c(3:ncol(acgh_frame))])

Error: protect(): protection stack overflow

これは、データフレーム内の変数の数が多い(26k以上)ためです。使用する変数を少なくすると、エラーは表示されません。コマンドラインRでこれを解決する方法を知っていますが、Rスタジオにとどまる必要があるため、Rスタジオから修正したいと思います。だから、どうすればこれを行うことができますか?

11
Ansjovis86

@ Ansjovis86

Rstudioのコマンドライン引数としてppsizeを指定できます

_rstudio.exe --max-ppsize=5000000
_

_.Rprofile_を介して、または実行時にoptions(expressions = 5e5)コマンドを使用して、式オプションを設定することもできます。

_> options(expressions = 5e5)
>?options
_

.。

式:

評価されるネストされた式の数に制限を設定します。有効な値は25 ... 500000で、デフォルトは5000です。これを増やす場合は、より大きな保護スタックでRを開始することもできます。メモリ内の--max-ppsizeを参照してください。また、Cスタックのオーバーフローによってセグメンテーション違反が発生する可能性があることにも注意してください。可能性のあるOSでは、それを増やすことができます。制限に達すると、エラーがスローされます。現在評価中の番号は、_Cstack_info_を呼び出すことで確認できます。

_Cstack_info() - to determine current setting.s
_
6
Technophobe01

根本的な原因はmodel.matrix関数。1)大量のメモリを使用します。 2)十分に大きい番号に対してこのエラーをスローします。列の。

私のglmnetUtilsパッケージを使用してみてください。これにより、これらの両方の問題を回避できます。モデル行列を一度に作成するのではなく、用語ごとに作成します。また、巨大な数式を評価しようとはしません。これはlot高速であり、スタックを爆破するリスクはありません。

install.packages("glmnetUtils")
library(glmnetUtils)
glmnet(response ~ ., data = acgh_frame[3:ncol(acgh_frame)])
0
Hong Ooi