R 中的 Kolmogorov-Smirnov 检验 - For 循环
Kolmogorov-Smirnov test in R - For-loop
我在使用 Kolmogorow-Smirnow-test 比较两组曲线时遇到问题。
我希望程序做的是将曲线 1 的每个变化与曲线 2 的每个变化进行比较。为此,我尝试构建一个遍历曲线 1 的 for 循环,并在循环另一个循环遍历曲线 2。
不幸的是,在执行代码时,我收到一条关于
的错误消息
"not enough x-Data“
当我尝试 运行 通过手动比较每条曲线的一个变化来进行测试时,它起作用了,所以我认为问题出在两个循环和 KS 测试的组合上。
如果有人遇到过类似的错误并且能够解决问题,我将不胜感激任何关于如何修复它的建议。谢谢!
示例data.frames
:
Kurve1 <- structure(list(Punkte = 1:21,
Trial.1 = c(105.5, 85.3, 63.1, 54.9, 42, 34.1, 30.7,
24.2, 20.1, 15.7, 14, 11, 9.3, 7.2, 6.6,
5.3, 4.2, 3.3, 2.6, 1.8, 0.9),
Trial.2 = c(103.8, 85.2, 64.3, 54.1, 41.8, 35.9, 29,
23.7, 20.2, 15.9, 13.5, 11, 9.3, 7.3, 6.4,
5.5, 4.3, 3.4, 2.5, 1.9, 0.9),
Trial.3 = c(104.8, 87.2, 64.9, 52.8, 40.8, 35.6, 29.1,
24.5, 20.4, 16.2, 13.7, 11.2, 9.2, 7.5,
6.4, 5.5, 4.2, 3.5, 2.5, 1.8, 0.9),
Trial.4 = c(106.9, 83.9, 67.1, 55.1, 44.1, 34.1, 29.3,
22.9, 19.4, 16.7, 13.6, 10.8, 9.4, 7.4,
6.1, 5.6, 4.4, 3.5, 2.4, 1.9, 0.9),
Trial.5 = c(104.8, 84.3, 68.7, 54.8, 45.3, 35.2, 28.9,
23.1, 20.1, 16.9, 13.3, 11, 9.6, 7.1, 6.3,
5.4, 4.5, 3.4, 2.3, 2, 0.9)),
class = "data.frame", row.names = c(NA, -21L))
Kurve2 <- structure(list(Punkte = 1:21,
Trial.1 = c(103.5, 81.2, 66.2, 54.5, 45.1, 39.1, 30.9,
27, 21.9, 19.3, 16.6, 14.9, 12.9, 11, 10.1,
9.2, 8, 7.1, 6.3, 6.2, 5),
Trial.2 = c(104, 81, 66.9, 55.2, 46, 38.7, 31.2, 27.3,
22.3, 20, 17.2, 15.2, 12.9, 11.1, 10.2,
9.1, 8, 7.1, 6.4, 5.9, 5),
Trial.3 = c(103.9, 81.9, 67.2, 53.8, 45.4, 38.5, 31.5,
26.8, 22.2, 19.8, 17.4, 15.1, 13, 10.9,
10.1, 9.2, 8.1, 7.1, 6.4, 6, 4.9),
Trial.4 = c(104.2, 84.1, 68.7, 55.4, 45.1, 36.3, 32,
26.9, 22.8, 19.8, 16.8, 14.8, 13.2, 10.9,
10.3, 9.1, 8.2, 7.2, 6.3, 6.1, 5),
Trial.5 = c(103.8, 83.2, 69.2, 55.7, 44.8, 36.4, 31.4,
26.7, 22.1, 18.9, 16.9, 14.4, 13, 11.1,
10.2, 9, 7.9, 7, 6.3, 6.1, 5.1)),
class = "data.frame", row.names = c(NA, -21L))
我用于循环的代码:
for(i in 1:ncol(Kurve1)){
for(j in 1:ncol(Kurve2)){
ks.test(Kurve1$Trial.[i], Kurve2$Trial.[j], alternative = "greater")
}
}
这会起作用:
for(i in 1:(ncol(Kurve1) - 2)){
for(j in (i + 1):(ncol(Kurve2) - 1)){
print(paste0("Trial.", i, " - Trial.", j))
ks_result <- ks.test(Kurve1[, paste0("Trial.", i)],
Kurve2[, paste0("Trial.", j)],
alternative="greater")
print(ks_result)
}
}
解释:
因为 运行 同一列的 KS 测试没有意义,运行 也没有意义 [=11] =] 和 Trial.2 ~ Trial.1
等,你必须 运行 你的外部 for
循环从 1
到最后一个((ncol(Kurve1) - 2)
)索引 Trial.*
列,并且您必须 运行 从下一个索引开始的内部 for
循环,因为外循环具有 (i + 1
) 到最后一个索引 ((ncol(Kurve2) - 1)
) Trial.*
列。
您不能粘贴像 Trial.[i]
这样的字符串,您必须为此使用 paste
函数。由于 Kurve1$paste0("Trial.", i)
符号不起作用,您必须使用提取运算符 [
来获取所需的列 (Kurve1[, paste0("Trial.", i)]
)
就像在(嵌套的)for 循环中一样,ks.test
运行 静静地添加了 print
以便能够看到结果。我还添加了一行 print(paste0("Trial.", i, " - Trial.", j))
以使用它所属的列标记实际结果。
我在使用 Kolmogorow-Smirnow-test 比较两组曲线时遇到问题。
我希望程序做的是将曲线 1 的每个变化与曲线 2 的每个变化进行比较。为此,我尝试构建一个遍历曲线 1 的 for 循环,并在循环另一个循环遍历曲线 2。
不幸的是,在执行代码时,我收到一条关于
的错误消息"not enough x-Data“
当我尝试 运行 通过手动比较每条曲线的一个变化来进行测试时,它起作用了,所以我认为问题出在两个循环和 KS 测试的组合上。
如果有人遇到过类似的错误并且能够解决问题,我将不胜感激任何关于如何修复它的建议。谢谢!
示例data.frames
:
Kurve1 <- structure(list(Punkte = 1:21,
Trial.1 = c(105.5, 85.3, 63.1, 54.9, 42, 34.1, 30.7,
24.2, 20.1, 15.7, 14, 11, 9.3, 7.2, 6.6,
5.3, 4.2, 3.3, 2.6, 1.8, 0.9),
Trial.2 = c(103.8, 85.2, 64.3, 54.1, 41.8, 35.9, 29,
23.7, 20.2, 15.9, 13.5, 11, 9.3, 7.3, 6.4,
5.5, 4.3, 3.4, 2.5, 1.9, 0.9),
Trial.3 = c(104.8, 87.2, 64.9, 52.8, 40.8, 35.6, 29.1,
24.5, 20.4, 16.2, 13.7, 11.2, 9.2, 7.5,
6.4, 5.5, 4.2, 3.5, 2.5, 1.8, 0.9),
Trial.4 = c(106.9, 83.9, 67.1, 55.1, 44.1, 34.1, 29.3,
22.9, 19.4, 16.7, 13.6, 10.8, 9.4, 7.4,
6.1, 5.6, 4.4, 3.5, 2.4, 1.9, 0.9),
Trial.5 = c(104.8, 84.3, 68.7, 54.8, 45.3, 35.2, 28.9,
23.1, 20.1, 16.9, 13.3, 11, 9.6, 7.1, 6.3,
5.4, 4.5, 3.4, 2.3, 2, 0.9)),
class = "data.frame", row.names = c(NA, -21L))
Kurve2 <- structure(list(Punkte = 1:21,
Trial.1 = c(103.5, 81.2, 66.2, 54.5, 45.1, 39.1, 30.9,
27, 21.9, 19.3, 16.6, 14.9, 12.9, 11, 10.1,
9.2, 8, 7.1, 6.3, 6.2, 5),
Trial.2 = c(104, 81, 66.9, 55.2, 46, 38.7, 31.2, 27.3,
22.3, 20, 17.2, 15.2, 12.9, 11.1, 10.2,
9.1, 8, 7.1, 6.4, 5.9, 5),
Trial.3 = c(103.9, 81.9, 67.2, 53.8, 45.4, 38.5, 31.5,
26.8, 22.2, 19.8, 17.4, 15.1, 13, 10.9,
10.1, 9.2, 8.1, 7.1, 6.4, 6, 4.9),
Trial.4 = c(104.2, 84.1, 68.7, 55.4, 45.1, 36.3, 32,
26.9, 22.8, 19.8, 16.8, 14.8, 13.2, 10.9,
10.3, 9.1, 8.2, 7.2, 6.3, 6.1, 5),
Trial.5 = c(103.8, 83.2, 69.2, 55.7, 44.8, 36.4, 31.4,
26.7, 22.1, 18.9, 16.9, 14.4, 13, 11.1,
10.2, 9, 7.9, 7, 6.3, 6.1, 5.1)),
class = "data.frame", row.names = c(NA, -21L))
我用于循环的代码:
for(i in 1:ncol(Kurve1)){
for(j in 1:ncol(Kurve2)){
ks.test(Kurve1$Trial.[i], Kurve2$Trial.[j], alternative = "greater")
}
}
这会起作用:
for(i in 1:(ncol(Kurve1) - 2)){
for(j in (i + 1):(ncol(Kurve2) - 1)){
print(paste0("Trial.", i, " - Trial.", j))
ks_result <- ks.test(Kurve1[, paste0("Trial.", i)],
Kurve2[, paste0("Trial.", j)],
alternative="greater")
print(ks_result)
}
}
解释:
因为 运行 同一列的 KS 测试没有意义,运行 也没有意义 [=11] =] 和
Trial.2 ~ Trial.1
等,你必须 运行 你的外部for
循环从1
到最后一个((ncol(Kurve1) - 2)
)索引Trial.*
列,并且您必须 运行 从下一个索引开始的内部for
循环,因为外循环具有 (i + 1
) 到最后一个索引 ((ncol(Kurve2) - 1)
)Trial.*
列。您不能粘贴像
Trial.[i]
这样的字符串,您必须为此使用paste
函数。由于Kurve1$paste0("Trial.", i)
符号不起作用,您必须使用提取运算符[
来获取所需的列 (Kurve1[, paste0("Trial.", i)]
)就像在(嵌套的)for 循环中一样,
ks.test
运行 静静地添加了print
以便能够看到结果。我还添加了一行print(paste0("Trial.", i, " - Trial.", j))
以使用它所属的列标记实际结果。