我正在从一个看起来像以下内容的文件中读取一张稀疏的表:

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-th列中的值表明在此模拟中观察到了多少次值I-1。例如,在第一个模拟(第一行)中,我们获得了一个带有值'0'(第一列)的结果,7个带有值'2'(第三列)等的结果。

我希望为所有仿真结果创建平均累积分布函数(CDF),以便以后可以使用它来计算经验P值以实现真实结果。

为此,我可以首先总结每一列,但是我需要对Undef列进行零。

如何阅读具有不同行长的表格?如何总结列替换为0'的“ undef”值的列?最后,如何创建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 包)功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top