如何计算R中的经验CDF?

时间:2010-11-04 17:17:35

标签: r matrix cumulative-sum

我正在从文件中读取稀疏表格,如下所示:

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'的结果(第一列),7个值为'2'的结果(第三列)等。

我希望为所有模拟结果创建一个平均累积分布函数(CDF),因此我稍后可以使用它来计算真实结果的经验p值。

要做到这一点,我可以先对每一列进行总结,但我需要为undef列取零。

如何读取具有不同行长度的表格?如何总结用'0'代替'undef'值的列?最后,我如何创建CDF? (我可以手动完成,但我想有一些包可以做到这一点。)

2 个答案:

答案 0 :(得分:4)

这将读取以下数据:

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)

答案 1 :(得分:2)

您可以使用ecdf()(在基础R中)或Ecdf()(来自Hmisc包)功能。