Rのglmでの「NA」値の処理方法


19

データテーブルT1があり、これには約1000個の変数(V1)と約2億個のデータポイントが含まれています。データはまばらで、ほとんどのエントリはNAです。各データポイントには、他と区別するための一意のIDと日付のペアがあります。

別の変数セット(V2)を含む別のテーブルT2があります。このテーブルには、T2のエントリを一意に識別するIDと日付のペアもあります。

T1のデータを使用して、T2の変数の値を予測できると思われます。

これを証明するために、Rに「glm」モデルを適用し、T1の変数に依存するT2の変数を本当に見つけることができるかどうかを確認することを考えました。

T2の各変数について、同じidと日付のペアを持つT1のすべてのデータを引き出し始め、テスト変数のいくつかについて、はるかに小さい〜50Kデータポイントになりました。

glmの適用で今直面している問題は次のとおりです。

  1. 場合によっては、「フィットが見つかりません」というエラーと「glm.fit:アルゴリズムが収束しませんでした」という警告が表示されます。なぜ表示されるのか分かりませんか?

  2. NAはglmでどのように扱われますか?最初に「NA」を含むすべてのレコードを削除してから、フィッティングを実行しますか?

  3. 最初にすべてのNAを削除してから「glm」を呼び出すのは良い戦略ですか?それらのほとんどがNAであるため、これによりデータポイントが大幅に削減される可能性があることを恐れています。

  4. 係数の計算に使用される方法。出力がどのように計算されるかを議論するウェブサイト、論文、または本を見つけることができませんでした。

「NA」を使用して、または使用せずにglmをテストし、データをフィッティングする際にNAが考慮される点について、difftの回答を見つけました。

例1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

例2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 

回答:


27

NA処理: glmが欠落データを処理する方法を制御できます。glm()には、na.actionglmがデータ内のNAを処理するために次の汎用関数のどれを使用するかを示す引数があります。

  • na.omitおよびna.exclude:観測値に欠損値が含まれている場合、観測値は削除されます。na.excludeが使用される場合、一部の関数は、省略されたケースにNAを挿入することにより、残差と予測を正しい長さにパディングします。
  • na.pass:NAを含むすべてのデータを保持する
  • na.fail:欠損値が含まれていない場合にのみオブジェクトを返します

na.actionを設定しない場合、glm()はRのグローバルオプションをチェックして、デフォルトが設定されているかどうかを確認します。オプションにアクセスするには、getOption("na.action")またはoptions("na.action")を使用します。たとえば、オプションを使用して設定できます。options(na.action = "na.omit") ただし、例1で提供したR出力から、を設定しているようですna.action = na.omit。そのため、はい、少なくともその場合、フィッティングの前にNAを持つすべてのケース/行を削除します。さらに、na.action = na.passデータにNAがある場合(試してみてください)にglm()が失敗する原因になると確信しています。

エラー: glm()は、反復手順(反復最小二乗法、IWLS)を使用して最尤推定を行っています。事前に定義された反復回数しか実行されないため、エラーが発生することがあります。適切に適合しない場合は、中止されます。この数は、引数maxitによって制御されますmaxit = 25。デフォルトはです。高く設定してみることもできますが、もちろん時間がかかります。(設定trace=TRUEすると、各反復の結果が表示されます。)

その他の情報源: glmのヘルプ?glmファイルhelp(glm)は、このファイルからアクセス可能または説明されています。他の2つの有用なリソースは次のとおりです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.