【问题标题】:R: loop performing ks tests across data frame stored in matrixR:循环对存储在矩阵中的数据帧执行 ks 测试
【发布时间】:2017-12-26 20:15:39
【问题描述】:

我为奇怪的语法道歉,我刚刚学习编程。我有 100 列和 5304 行的 df。我需要使用第 5 个数字列或参考列对最后 94 个数字列 (6:ncol(df)) 执行单独的两侧 ks.tests:

r<-df$rank. 

我还想将 pvalues 存储在矩阵中。据我了解,我可以使用“for loop”或“apply”函数。我有一个简单的代码,它只输出一个统计摘要(看起来它正在覆盖结果):

for (i in 6:ncol(df))
y<-df[,i]
ks.test(r,y)->K
> K

Two-sample Kolmogorov-Smirnov test

data:  r and y
D = 0.71983, p-value < 2.2e-16
alternative hypothesis: two-sided

我已经尝试了很多变体以及错误地使用 lapply。 关于为什么“K”不应该返回多个值或将输出分配给矩阵的任何见解?谢谢你。

编辑:样本数据集

probe set   symbol  zscore  rank X1   X4 X13 X15 ....N (N=100)
22133-x_at  SP110   4.73635   1  400  14  5  1000
.                             2  5    430 56 150
.                             3  24   78  23 9000
...N
(N=5304)

【问题讨论】:

  • 您能否提供一个示例数据集。另外,请阅读 ?ks.test。 x 是“数据值的数字向量”。你的 r 是数字吗?
  • 感谢您的回复。我添加了带有示例数据的编辑。是的,r 是一个数字向量,就像我试图调用函数的其他列一样。
  • 仅供参考,ks.test(r,y) 旨在评估两个样本是否“来自相同的连续分布”。您的 r 是排名,因此我不确定您是否做得很好。

标签: r for-loop matrix lapply kolmogorov-smirnov


【解决方案1】:

考虑sapply 返回一个由ks.test 组成的矩阵statisticp.value

# RANDOM DATA TO DEMONSTRATE
set.seed(147)
df <- data.frame(id1 = sample(LETTERS, 5304, replace=TRUE),
                 id2 = sample(LETTERS, 5304, replace=TRUE),
                 id3 = sample(LETTERS, 5304, replace=TRUE),
                 id4 = sample(LETTERS, 5304, replace=TRUE),
                 setNames(lapply(5:100, function(i) rnorm(5304)),
                          paste0("Col", 5:100)))

r <- df[,5]
res <- sapply(df[,6:100], function(y) {
  ks <- ks.test(r, y)
  c(statistic=ks$statistic, p.value=ks$p.value)
  setNames(c(ks$statistic, ks$p.value), c("statistic", "p.value"))
})

# PRINT FIRST FIVE COLS
res[,1:5]
#                 Col6       Col7       Col8      Col9      Col10
# statistic 0.02111614 0.01338612 0.01074661 0.0224359 0.01677979
# p.value   0.18774138 0.72887906 0.91933648 0.1384762 0.44412866

【讨论】:

  • 感谢您的帮助!我想我能够理解这是如何工作的。然而,连接统计数据和分配新变量的两行对我来说似乎有点多余。为了努力学习,您介意解释一下函数“SetNames”的结构以及为什么包含它吗?我在没有这一行的情况下运行了代码,它看起来是一样的。此外,帮助页面没有说明它在这种情况下的优势。再次感谢@Parfait
  • setNames() 只是将row.names 添加到矩阵中:statisticp.value。是的,sapply 运行不需要这样的名称。您可以简单地使用 c(ks$statistic, ks$p.value) 结束函数,但不会有关于哪一行是哪一行的标签。
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多