私は、一般的なデータセットのさまざまな分析を実行するために、大規模なRプロジェクトに取り組んでいます。分析ごとにいくつかの個別のスクリプトと、それぞれを順番に呼び出す高レベルのスクリプトを作成しました。init.R
各スクリプトは、メモリを消去するスクリプトを呼び出すことから始まります( rm(list=ls(all=TRUE))
)。
私は最近、スクリプトの順序に応じて、summary()
(そして、私が思うに)異なる出力を生成することを発見しました。or (パッケージ)coef()
を使用するモデルに適合するスクリプトでは、これらが最初に実行されると、「新しい」Rセッションで、出力に完全なラベルが付いた因子が一覧表示されます。lm()
gam()
mgcv
summary()
ただし、最初に他のスクリプトを実行すると、単純な入れ子aov()
関数を使用し、他のパッケージを使用してグラフや他の出力を生成し、次に前述のスクリプトを再実行します。summary()
代わりに、数値(「コード化」)を使用してラベル付けされた因子レベルで出力を生成します。実際の因子レベルのラベルではなく、値)。
残念ながら、スクリプトのどこでこの動作が変化するかを正確に特定していないため、これは最小限の作業例を使用して簡単に「再現」できるものではありません。クイックテストでいくつか確認しました。
- を使用してスクリプト間でメモリがクリアされる
rm(list=ls())
ため、この変更の原因となるメモリはありません。 summary()
それ自体は変更されません。モデルフィッティング関数は、実際にはわずかに異なる出力を生成します(で確認されますall.equal()
)。これはさらに厄介です。スクリプトを異なる順序で実行するときに生成される保存されたオブジェクトは、ロードされるたびに同じ出力を確実に生成しますが、その出力は、フィットされたモデルオブジェクトの生成に使用されるスクリプトの順序によって異なります(各スクリプト間でメモリがクリアされます)。- スクリプトの順序に応じて、
summary( lm(...) )
モデル項の推定値も異なりますが、残差の要約、R ^ 2、および全体的なF検定は同じです。非常に奇妙です。
- スクリプトの順序に応じて、
- 以前のスクリプトでロードされたパッケージを削除しても、デフォルトの(望ましい)動作を回復できません。パッケージをロードする順序は重要ですか?
- Rを終了して再起動すると、デフォルトの動作に戻ります。
- この回答には問題を解決するものは何もないようです: Rインスタンスをリセットします
理想的には、各スクリプトを順番に実行するだけですべての結果と出力を再現できるようにプロジェクトを作成したいsource()
のですが、この奇妙な「バグ」(私のコードではRのせいではありません)は、出力がそうではないことを意味します一貫性があり、順序によって異なります:(
モデルフィッティング関数の動作方法を変更したり、渡されたデータフレームに因子レベルを格納したりする可能性のある、メモリ内にとどまるオブジェクトまたはパッケージ以外に何かありますか?
編集
上記の質問に対する答えは、コントラストオプションであることに気づきました(以下を参照)。新しい質問:
options()をデフォルト設定、つまりRの起動時に使用される値にリセットするにはどうすればよいですか?「工場出荷時のデフォルト」はです
options(contrasts=c("contr.treatment","contr.poly")))
が、内部デフォルトに再起動する方法があるかどうか疑問に思っています(「工場出荷時のデフォルト」でない場合)。