1

我正在从一个看起来像这样的文件中读取一个稀疏表:

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?(我可以手动执行此操作,但我想有一些包可以执行此操作)。

4

2 回答 2

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)
于 2010-11-04T17:44:41.103 回答
2

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

于 2010-11-04T17:31:48.467 回答