R 逐行将 KS 测试应用于 2 个矩阵
R apply KS Test to 2 Matrices Row by Row
我在 R 中有两个矩阵 A 和 B,它们的行数相同,但列数不同。
我想 运行 一个 Kolomogrov-Smirnov test 每个矩阵逐行。也就是说,第一个测试是 ks.test(as.vector(A[1,]), as.vector(B[1,])
,第二个是 ks.test(as.vector(A[2,]), as.vector(B[2,])
,依此类推。理想情况下,将每个测试的结果存储在向量或数据框中。
我认为 mapply
比较合适,但它总是给我带来比预期更多的结果。我认为它是逐个元素而不是逐行执行测试。这是我的代码块:
mapply(ks.test, x=A, y=B)
当我只是 运行 时,仅测试第一行并不能按预期工作:
mapply(ks.test, x=as.vector(A[1,]), y=as.vector(B[1,]))
如何获得 N p 值 的所需输出,其中 N 是原始矩阵的行数。?
这是我的每个矩阵的第一行的样子:
> A[1,]
[1] 0 0 0 0 0 0 0 0 0
> B[1,]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
你可以通过在行索引
上使用sapply
得到你想要的
sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,])))
实际上,看起来唯一有趣的部分是 p 值,因此可以使用
来简化
sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,]))$p)
[1] 0.01587302 0.01587302 0.01587302 0.01587302
我们可以使用Map/mapply
。在使用 Map/mapply
时,我们需要了解它是将函数应用于输入数据的相应元素。如果输入数据是向量,那么相应的元素将是向量的每个元素,类似地 matrix
是具有维度的 vector
。它将在每个元素上应用该功能。因此,我们可以通过 row
split
matrix
然后将函数应用于相应的 list
元素
unlist(mapply(ks.test, split(A, row(A)), split(B, row(B)))[2,], use.names = FALSE)
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159
或使用 for
循环
r1 <- numeric(nrow(A))
for(i in seq_len(nrow(A))){
r1[i] <- ks.test(A[i,], B[i,])$p.value
}
r1
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159
数据
set.seed(24)
A <- matrix(rnorm(25), 5, 5)
set.seed(42)
B <- matrix(rnorm(25), 5, 5)
我在 R 中有两个矩阵 A 和 B,它们的行数相同,但列数不同。
我想 运行 一个 Kolomogrov-Smirnov test 每个矩阵逐行。也就是说,第一个测试是 ks.test(as.vector(A[1,]), as.vector(B[1,])
,第二个是 ks.test(as.vector(A[2,]), as.vector(B[2,])
,依此类推。理想情况下,将每个测试的结果存储在向量或数据框中。
我认为 mapply
比较合适,但它总是给我带来比预期更多的结果。我认为它是逐个元素而不是逐行执行测试。这是我的代码块:
mapply(ks.test, x=A, y=B)
当我只是 运行 时,仅测试第一行并不能按预期工作:
mapply(ks.test, x=as.vector(A[1,]), y=as.vector(B[1,]))
如何获得 N p 值 的所需输出,其中 N 是原始矩阵的行数。?
这是我的每个矩阵的第一行的样子:
> A[1,]
[1] 0 0 0 0 0 0 0 0 0
> B[1,]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
你可以通过在行索引
上使用sapply
得到你想要的
sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,])))
实际上,看起来唯一有趣的部分是 p 值,因此可以使用
来简化sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,]))$p)
[1] 0.01587302 0.01587302 0.01587302 0.01587302
我们可以使用Map/mapply
。在使用 Map/mapply
时,我们需要了解它是将函数应用于输入数据的相应元素。如果输入数据是向量,那么相应的元素将是向量的每个元素,类似地 matrix
是具有维度的 vector
。它将在每个元素上应用该功能。因此,我们可以通过 row
split
matrix
然后将函数应用于相应的 list
元素
unlist(mapply(ks.test, split(A, row(A)), split(B, row(B)))[2,], use.names = FALSE)
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159
或使用 for
循环
r1 <- numeric(nrow(A))
for(i in seq_len(nrow(A))){
r1[i] <- ks.test(A[i,], B[i,])$p.value
}
r1
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159
数据
set.seed(24)
A <- matrix(rnorm(25), 5, 5)
set.seed(42)
B <- matrix(rnorm(25), 5, 5)