web-dev-qa-db-ja.com

Rで欠落/不完全なデータを処理する-NAをマスクするが削除しない機能はありますか?

データ分析を目的としたDSLから期待されるように、Rは欠落/不完全なデータを非常にうまく処理します。たとえば、

多くのR関数にはna.rmフラグがあり、[〜# 〜] true [〜#〜]、NAを削除します。

>>> v = mean( c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T)
>>> v
      (5, 6, 12, 87, 9, 43, 67)

ただし、関数呼び出しの前にNAbeforeを処理する場合は、次のようにする必要があります。

ベクトルから各「NA」を削除するには:

vx = vx[!is.na(a)]

ベクトルから各「NA」を削除し、「0」で置き換えます:

ifelse(is.na(vx), 0, vx)

データフレームから「NA」を含む各行全体を削除するには:

dfx = dfx[complete.cases(dfx),]

これらの関数はすべて永久にremove「NA」または「NA」が含まれる行。

場合によっては、これで十分ではないことがあります。ワークフローの次のステップでは、データフレームの「NA」で切り取られたコピーを作成する必要があるかもしれませんが、後続のステップでは、それらの行を元に戻したい場合があります(たとえば、以前に「完全なケース」を呼び出したために行が欠落しているが、その列には「NA」値がない列の列ごとの統計。

私が探しているものについてできるだけ明確にする:python/numpyにはクラスがありますマスクされた配列maskメソッド。これにより、関数呼び出し中に隠蔽-しかし削除はできません--NAを使用できます。 Rに類似の関数はありますか?

26
doug

欠落しているデータを正確にどうするか(欠落していることがわかっている場合はNAとしてフラグが立てられる可能性があります)は、ドメインごとに大きく異なる場合があります。

時系列に関連する例として、スキップしたり、塗りつぶしたり、補間したり、別の方法で補間したりする場合、...はjust (非常に便利で人気のある) Zoo には、NAの処理に関連する次のすべての関数があります。

_Zoo::na.approx  Zoo::na.locf    
Zoo::na.spline  Zoo::na.trim    
_

近似(異なるアルゴリズムを使用)、キャリーフォワードまたはバックワード、スプライン補間またはトリムの使用を可能にします。

別の例は、CRANに多数の欠落している補完パッケージであり、ドメイン固有のソリューションを提供することがよくあります。 [したがって、RをDSLと呼ぶ場合、これは何ですか? 「ドメイン固有の言語向けのサブドメイン固有のソリューション」またはSDSSFDSL?かなり一口:)]

しかし、あなたの特定の質問については、いいえ、私は、観測を「除外する」としてマークできるようにするベースRのビットレベルのフラグを知りません。私は、ほとんどのRユーザーがna.omit()などの関数を使用するか、前述の_na.rm=TRUE_オプションを使用すると思います。

19

データを確認して、欠損値のタイプを推測することをお勧めします。MCAR(完全でランダムな欠損)、MAR(ランダムに欠損)、MNAR(欠損なし)ランダム)?これら3つのタイプに基づいて、欠損値の根本的な構造を調査し、代入がまったく適用可能かどうかを結論付けることができます(MNARでない場合は幸運です。なぜなら、その場合、欠損値は無視できないためです、そしていくつかの未知の根本的な影響、要因、プロセス、変数などに関連しています。

第3章 "RおよびGGobiを使用したデータアナリストのインタラクティブおよびダイナミックグラフィックス" byDi CookおよびDeborah Swayneは、このトピックに関する優れたリファレンスです。

この章ではnormパッケージの動作を確認しますが、Hmiscパッケージにはデータ補完ルーチンがあります。 Ameliacat(カテゴリカルな欠損値の代入について)、mimitoolsVIMvmv(不足しているデータの視覚化のため)。

正直なところ、統計についての質問や、R欠損データ補完機能についての質問はまだよくわかりません。私は2番目と最初の1つについて適切な参照を提供したと思います:NAを中心傾向(平均、中央値など)で置き換えることができるため、変動性を減らすか、ランダムな定数を「引き出し」ます観察された(記録された)ケースの場合、またはNAを基準として含み、他の変数を予測子として含む変数を使用して回帰分析を適用し、残差をNAに割り当てる...これはNAを処理するエレガントな方法ですが、多くの場合、そうではありません。 CPUを使いやすくします(私は1.1 GHzのCeleronを持っているので、穏やかでなければなりません)。

これは最適化の問題です...明確な答えはありません。何をどのようにして固執しているのかを判断する必要があります。しかし、データを見ることは常に良い習慣です! =)Cook&Swayneを必ずチェックしてください-これは、巧みに書かれた優れたガイドです。 "Rを使用した線形モデル" byFarawayには、欠損値に関する章も含まれています。

それで。

幸運を! =)

15
aL3xa

関数na.exclude()は、一部の(重要な)関数のオプションにすぎませんが、希望どおりに聞こえます。

モデルのフィッティングと操作のコンテキストでは、RにはNAを処理するためのジェネリック関数のファミリーがあります:na.fail()na.pass()na.omit()、およびna.exclude()。次に、これらは、lm()glm()nls()などのRの主要なモデリング関数の引数とMASS、rpart、そしてサバイバルパッケージ。

4つの汎用関数はすべて、基本的にフィルターとして機能します。 na.fail()は、NAがない場合にのみデータを渡します。それ以外の場合は失敗します。 na.pass()はすべてのケースを通過させます。 na.omit()na.exclude()はどちらも、NAのケースを除外し、他のケースを通過させます。ただし、na.exclude()には、結果のオブジェクトを処理する関数にNAを考慮するように指示する別の属性があります。 attributes(na.exclude(some_data_frame))を実行すると、この属性が表示されます。これは、線形モデルのコンテキストでna.exclude()predict()の動作を変更する方法のデモです。

_fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40))

## We can tell the modeling function how to handle the NAs
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata)

predict(r_omitted)
#        1        2        4 
# 1.115385 1.846154 4.038462 
predict(r_excluded)
#        1        2        3        4 
# 1.115385 1.846154       NA 4.038462 
_

ちなみに、デフォルトのna.actionはoptions("na.action")によって決定され、na.omit()で始まりますが、設定することもできます。

8
MattBagg