Rで複数の種類の欠落を処理するにはどうすればよいですか?
-
26-10-2019 - |
質問
多くの調査には、さまざまな種類の欠落に関するコードがあります。たとえば、コードブックは次のことを示している場合があります。
0-99データ
-1質問はありません
-5わからない
-7は応答を拒否しました
-9モジュールは尋ねられません
Stataには、これらの複数の種類の欠落を処理するための美しい施設があります。これにより、ジェネリックを割り当てることができます。データが欠落しているが、より具体的な種類の欠落(.a、.b、.c、...、.z)も許可されています。 Missingnessレポートを表示するすべてのコマンドは、行方不明のすべてのエントリについて回答しますが、指定されていますが、後でさまざまな種類のMissingnessを整理することもできます。これは、応答を拒否することは、質問されない質問とは異なる帰属戦略に異なる意味を持っていると信じるときに特に役立ちます。
私はRでそのような施設を駆け抜けたことはありませんが、この機能を本当に持ちたいと思っています。いくつかの異なるタイプのNAをマークする方法はありますか?より多くのデータ(欠落の種類を含む長さnrow(my.data.frame)のベクトル、または行がどのような種類の欠落を持っているかを含むよりコンパクトなインデックスのいずれかを作成することを想像できますが、それはかなり扱いにくいようです。
解決
私はあなたが探しているものを知っています、そしてそれはRで実装されていません。私はそれが実装されているパッケージの知識はありませんが、それを自分でコーディングすることはそれほど難しくありません。
実行可能な方法は、コードを含む属性にデータフレームを追加することです。データフレーム全体を2倍にしてスペースを節約するのを防ぐために、完全なデータフレームを再構築する代わりに、そのデータフレームにインデックスを追加します。
例:
NACode <- function(x,code){
Df <- sapply(x,function(i){
i[i %in% code] <- NA
i
})
id <- which(is.na(Df))
rowid <- id %% nrow(x)
colid <- id %/% nrow(x) + 1
NAdf <- data.frame(
id,rowid,colid,
value = as.matrix(x)[id]
)
Df <- as.data.frame(Df)
attr(Df,"NAcode") <- NAdf
Df
}
これにより、次のことができます。
> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don't know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
'data.frame': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA NA NA 9 10
- attr(*, "NAcode")='data.frame': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
関数を調整して、異なる値のラベルを提供する追加の属性を追加することもできます。 この質問. 。以下をback transformすることができます。
ChangeNAToCode <- function(x,code){
NAval <- attr(x,"NAcode")
for(i in which(NAval$value %in% code))
x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]
x
}
> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
'data.frame': 10 obs. of 2 variables:
$ A: num 1 2 3 4 5 6 7 8 9 10
$ B: num 1 2 3 4 5 NA -2 -3 9 10
- attr(*, "NAcode")='data.frame': 3 obs. of 4 variables:
..$ id : int 16 17 18
..$ rowid: int 6 7 8
..$ colid: num 2 2 2
..$ value: num -1 -2 -3
これにより、必要に応じて、必要なコードのみを変更できます。引数が与えられていない場合、関数はすべてのコードを返すように適合させることができます。同様の関数を構築して、コードに基づいてデータを抽出することができます。自分でそれを理解できると思います。
しかし、1つの行では、属性とインデックスを使用することは、それを行う良い方法かもしれません。
他のヒント
最も明白な方法は、2つのベクトルを使用しているようです。
- ベクトル1:すべての欠損値が使用されているデータベクトル
NA
. 。例えば、c(2, 50, NA, NA)
- ベクトル2:データのタイプを示す因子のベクトル。例えば、
factor(c(1, 1, -1, -7))
ここで、要因1
正しく答えられた質問を示します。
この構造を持つことで、すべての標準なので、柔軟性の契約を作成することができます na.rm
引数は依然としてデータベクトルで動作しますが、因子ベクトルでより複雑な概念を使用できます。
@gsk3からの以下の質問を更新します
- データストレージは劇的に増加します: データストレージは2倍になります。ただし、サイズを2倍にすると実際の問題が発生する場合、他の戦略について考える価値があります。
- プログラムは自動的に対処しません。 それは奇妙なコメントです。一部の機能は、デフォルトで賢明な方法でNASを処理します。ただし、NASを異なって扱いたいと思うので、それはあなたが特注のことをしなければならないことを意味します。 NAが「質問されていない」場合のデータを分析するだけの場合は、データフレームサブセットを使用してください。
- これで、変数を概念的に操作するたびに2つのベクトルを一緒に操作する必要があります 私は2つのベクトルのデータフレームを想像していると思います。 2番目のベクトルに基づいてデータフレームをサブセットします。
- 標準的な実装はないので、私の解決策は他の誰かのものとは異なるかもしれません。 真実。ただし、棚から外れたパッケージがあなたのニーズを満たしていない場合、定義上、(ほぼ)何か違うことをしたいと思うでしょう。
調査データを分析したことがないことを述べる必要があります(ただし、大規模な生物学的データセットを分析しましたが)。上記の私の答えは非常に防御的に見えますが、それは私の意図ではありません。あなたの質問は良いことだと思います、そして私は他の回答に興味があります。
これは単なる「技術的な」問題以上のものです。欠損値の分析と代入において、徹底的な統計的背景を持つ必要があります。 1つの解決策には、RとGgobiで遊ぶ必要があります。いくつかのタイプのNA(NASをマージンにする)に非常に負の値を割り当て、「手動で」診断を行うことができます。 NAには3つのタイプがあることを忘れないでください。
- MCAR-完全にランダムに欠落している場合、p(欠落|観察、観察なし)= p(行方不明)
- 3月 - ランダムに欠落している場合、p(欠落|観察、観察なし)= P(欠落|観察)
- MNAR-ランダムに失われていない(または無駄ではない)。
私見この質問はより適しています 相互検証.
しかし、ここからのリンクがあります。
NAを完全に分配し、コード化された値を使用することができます。その後、それらをグローバルな欠損値にロールアップすることもできます。 NAがコーディングに問題を引き起こす可能性があり、分析に何が起こっているのかを正確に制御できるので、NAなしでコーディングすることを好むことがよくあります。弦「na」も使用して、物事を容易にすることが多いNAを表す場合。
-Ralph Winters
Ralphがすでに示唆しているように、私は通常、それらを値として使用します。なぜなら、欠損値のタイプはデータであるように見えるので、主にドキュメントにそれを望んでいた1つまたは2つの機会に、私は値に属性を使用しました。
> a <- NA
> attr(a, 'na.type') <- -1
> print(a)
[1] NA
attr(,"na.type")
[1] -1
そうすれば、私の分析はきれいですが、私はまだドキュメントを保持しています。しかし、私が言ったように:通常、私は価値を保持します。
アラン。
ここで「統計的背景コンポーネント」に追加したいと思います。 欠落データを使用した統計分析 これについて非常に良い読み物です。