R 对每行的一组列进行一次样本测试
R One sample test for set of columns for each row
我有一个数据集,其中包含 3 种情况下 50 个城市的水平和趋势。以下是示例数据 -
City <- paste0("City",1:50)
L1 <- sample(100:500,50,replace = T)
L2 <- sample(100:500,50,replace = T)
L3 <- sample(100:500,50,replace = T)
T1 <- runif(50,0,3)
T2 <- runif(50,0,3)
T3 <- runif(50,0,3)
df <- data.frame(City,L1,L2,L3,T1,T2,T3)
现在,在 3 个场景中,我使用以下代码找到了最低水平和最低趋势 -
df$L_min <- apply(df[,2:4],1,min)
df$T_min <- apply(df[,5:7],1,min)
现在我想分别检查这些最小值在水平和趋势之间是否有显着差异。因此,检查 L_min 的第 2-4 列和 T_min 的第 5-7 列。这需要为每个 城市(行) 完成,如果显着,则 return 它与哪一列有显着差异。
如果有人可以指导如何做到这一点,将会有所帮助。
谢谢!!
我会把我的想法放在这里,不过我期待着其他人的想法。
> head(df)
City L1 L2 L3 T1 T2 T3 L_min T_min
1 City1 251 176 263 1.162313 0.07196579 2.0925715 176 0.07196579
2 City2 385 406 264 0.353124 0.66089524 2.5613980 264 0.35312402
3 City3 437 333 426 2.625795 1.43547766 1.7667891 333 1.43547766
4 City4 431 405 493 2.042905 0.93041254 1.3872058 405 0.93041254
5 City5 101 429 100 1.731004 2.89794314 0.3535423 100 0.35354230
6 City6 374 394 465 1.854794 0.57909775 2.7485841 374 0.57909775
> df$FC <- rowMeans(df[,2:4])/df[,8]
> df <- df[order(-df$FC), ]
> head(df)
City L1 L2 L3 T1 T2 T3 L_min T_min FC
18 City18 461 425 117 2.7786757 2.6577894 0.75974121 117 0.75974121 2.857550
38 City38 370 117 445 0.1103141 2.6890014 2.26174542 117 0.11031411 2.655271
44 City44 101 473 222 1.2754675 0.8667007 0.04057544 101 0.04057544 2.627063
10 City10 459 361 132 0.1529519 2.4678493 2.23373484 132 0.15295194 2.404040
16 City16 232 393 110 0.8628494 1.3995549 1.01689217 110 0.86284938 2.227273
15 City15 499 475 182 0.3679611 0.2519497 2.82647041 182 0.25194969 2.117216
现在,根据顶部的 2:4 列,您拥有最多不同的行。列 5:7 以类似方式。
以及统计测试的一些技巧:
- 始终使用t.test(参数,基于均值)而不是 wilcoxon(u-mann whitney - 非参数,基于中位数),它具有更大的功效; 然而:
-数据集应该是大ex。 hipotesis:蒙特利尔的公民比魁北克高; t.test 当您从每个城市抽取 100 人时,效果很好,因此我们有 200 人的身高测量 100 对 100。
-所有样本的分布应该接近正态分布;或者两个样本应该具有远离正态分布的相似分布——它可能是二项式的。无论如何,当一个样本具有正态分布而第二个没有时,我们不能使用此测试。
-两个样本的大小应该相等,所以 100 对 100 是可以的,但 87 对 234 不完全是,p 值将低于 0.05,但它可能会被歪曲。
如果你的数据不满足以上条件,我更喜欢非参数测试,功率更小但抗性更强。
我有一个数据集,其中包含 3 种情况下 50 个城市的水平和趋势。以下是示例数据 -
City <- paste0("City",1:50)
L1 <- sample(100:500,50,replace = T)
L2 <- sample(100:500,50,replace = T)
L3 <- sample(100:500,50,replace = T)
T1 <- runif(50,0,3)
T2 <- runif(50,0,3)
T3 <- runif(50,0,3)
df <- data.frame(City,L1,L2,L3,T1,T2,T3)
现在,在 3 个场景中,我使用以下代码找到了最低水平和最低趋势 -
df$L_min <- apply(df[,2:4],1,min)
df$T_min <- apply(df[,5:7],1,min)
现在我想分别检查这些最小值在水平和趋势之间是否有显着差异。因此,检查 L_min 的第 2-4 列和 T_min 的第 5-7 列。这需要为每个 城市(行) 完成,如果显着,则 return 它与哪一列有显着差异。
如果有人可以指导如何做到这一点,将会有所帮助。
谢谢!!
我会把我的想法放在这里,不过我期待着其他人的想法。
> head(df)
City L1 L2 L3 T1 T2 T3 L_min T_min
1 City1 251 176 263 1.162313 0.07196579 2.0925715 176 0.07196579
2 City2 385 406 264 0.353124 0.66089524 2.5613980 264 0.35312402
3 City3 437 333 426 2.625795 1.43547766 1.7667891 333 1.43547766
4 City4 431 405 493 2.042905 0.93041254 1.3872058 405 0.93041254
5 City5 101 429 100 1.731004 2.89794314 0.3535423 100 0.35354230
6 City6 374 394 465 1.854794 0.57909775 2.7485841 374 0.57909775
> df$FC <- rowMeans(df[,2:4])/df[,8]
> df <- df[order(-df$FC), ]
> head(df)
City L1 L2 L3 T1 T2 T3 L_min T_min FC
18 City18 461 425 117 2.7786757 2.6577894 0.75974121 117 0.75974121 2.857550
38 City38 370 117 445 0.1103141 2.6890014 2.26174542 117 0.11031411 2.655271
44 City44 101 473 222 1.2754675 0.8667007 0.04057544 101 0.04057544 2.627063
10 City10 459 361 132 0.1529519 2.4678493 2.23373484 132 0.15295194 2.404040
16 City16 232 393 110 0.8628494 1.3995549 1.01689217 110 0.86284938 2.227273
15 City15 499 475 182 0.3679611 0.2519497 2.82647041 182 0.25194969 2.117216
现在,根据顶部的 2:4 列,您拥有最多不同的行。列 5:7 以类似方式。
以及统计测试的一些技巧:
- 始终使用t.test(参数,基于均值)而不是 wilcoxon(u-mann whitney - 非参数,基于中位数),它具有更大的功效; 然而:
-数据集应该是大ex。 hipotesis:蒙特利尔的公民比魁北克高; t.test 当您从每个城市抽取 100 人时,效果很好,因此我们有 200 人的身高测量 100 对 100。
-所有样本的分布应该接近正态分布;或者两个样本应该具有远离正态分布的相似分布——它可能是二项式的。无论如何,当一个样本具有正态分布而第二个没有时,我们不能使用此测试。
-两个样本的大小应该相等,所以 100 对 100 是可以的,但 87 对 234 不完全是,p 值将低于 0.05,但它可能会被歪曲。
如果你的数据不满足以上条件,我更喜欢非参数测试,功率更小但抗性更强。