Rで経験的CDFを計算するにはどうすればよいですか?
-
29-09-2019 - |
質問
私は次のように見えるファイルからまばらなテーブルを読んでいます:
1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1
注意行の長さは異なります。
各行は単一のシミュレーションを表します。各行のi番目の列の値には、このシミュレーションでI-1の値がいくつあるかを示しています。たとえば、最初のシミュレーション(最初の行)では、値「0」(最初の列)、値「2」(3番目の列)などの結果が1つの結果が得られました。
すべてのシミュレーション結果に対して平均累積分布関数(CDF)を作成したいので、後でそれを使用して、真の結果の経験的なp値を計算できます。
これを行うには、最初に各列を合計することができますが、ゼロをUNDEF列に使用する必要があります。
列の長さが異なるこのようなテーブルを読むにはどうすればよいですか? 「UNDEF」値を0に置き換える列を合計するにはどうすればよいですか?そして最後に、CDFを作成するにはどうすればよいですか? (私はこれを手動で行うことができますが、それを行うことができるパッケージがあると思います)。
解決
これにより、データが読み取られます。
dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1")
df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29))))
names(df) <- paste("Val", 1:29)
close(dat)
その結果:
> head(df)
Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12
1 1 0 7 0 0 1 0 0 0 5 0 0
2 1 0 0 1 0 0 0 3 0 0 0 0
3 0 0 0 1 0 0 0 2 0 0 0 0
4 1 0 0 1 0 3 0 0 0 0 1 0
5 0 0 0 1 0 0 0 2 0 0 0 0
....
データがファイルにある場合は、 dat
. 。このコードは、提供したデータに従って、最大29列があると推定しています。変更します 29
実際のデータに合わせて。
列の合計を使用します
df.csum <- colSums(df, na.rm = TRUE)
ecdf()
関数あなたが望むECDFを生成します、
df.ecdf <- ecdf(df.csum)
そして、それを使用してプロットできます plot()
方法:
plot(df.ecdf, verticals = TRUE)
他のヒント
使用できます ecdf()
(ベースRで)または Ecdf()
(から hmisc パッケージ)機能。
所属していません StackOverflow