R中列表子列表之间的Kruskal-Wallis测试
Posted
技术标签:
【中文标题】R中列表子列表之间的Kruskal-Wallis测试【英文标题】:Kruskal-Wallis test between a list sublists in R 【发布时间】:2018-06-16 17:07:15 【问题描述】:我对 R 很陌生。 我正在尝试在一个列表中的数据框架子列表(包含数字数据)之间运行 Kruskal-Wallis 测试,但我不断收到错误。
每个子列表都有一列,但行数不相等(因此,据我所知,它们不能存储在一个数据帧中)
数据:
data_list <- list(tumor = 0.004255040 0.002703172 0.007478089 0.003554968 0.003803952 0.005225325 0.004816366 0.005674340 0.003474605 0.004784456,
t = 0.004326186 0.008126497 0.009110830 0.004030094 0.005784066 0.006752136 0.009840556,
b = 0.004872971 0.009066809 0.005964638 0.003622466 0.011660714,
caf = 0.003618611 0.007463386 0.007463134 0.005453387 0.010409640 0.012020965))
所以它看起来像这样:
$tumor
1 0.004255040
2 0.002703172
3 0.007478089
4 0.003554968
5 0.003803952
6 0.005225325
7 0.004816366
8 0.005674340
9 0.003474605
10 0.004784456
$t
1 0.004326186
2 0.008126497
3 0.009110830
4 0.004030094
5 0.005784066
6 0.006752136
7 0.009840556
$b
1 0.004872971
2 0.009066809
3 0.005964638
4 0.003622466
5 0.011660714
$caf
1 0.003618611
2 0.007463386
3 0.007463134
4 0.005453387
5 0.010409640
6 0.012020965
我尝试了很多东西,都返回错误并且不成功:
> kruskal.test(data_list)
Error in `[.data.frame`(u, complete.cases(u)) :
undefined columns selected
> kruskal.test(list(data_list$tumor,data_list$t,data_list$b,data_list$caf))
Error in `[.data.frame`(u, complete.cases(u)) :
undefined columns selected
> kruskal.test(list(data_list$tumor[,1],data_list$t,data_list$b[,1],data_list$caf[,1]))
Error in `[.data.frame`(u, complete.cases(u)) :
undefined columns selected
> kruskal.test(unlist(data_list))
Error in kruskal.test.default(unlist(data_list)) :
argument "g" is missing, with no default
谢谢! :)
【问题讨论】:
您可以拥有一个包含 2 列的数据框。一列type
获取值tumour
、t
等,另一列value
获取您的值。因此,您在此处拥有的列表格式并不是唯一的选择。然后你可以做kruskal.test(value ~ type, data = mydata)
。
另外,您发布的数据集无法使用您的代码创建。
ab从哪里来?
“ab”是我的错误,我只是按原样复制了命令和错误,并没有将 ab(我使用的数据)更改为我在这里给它的名称。跨度>
AntoniosK,谢谢!没想到用因子来做这个测试,谢谢! :)
【参考方案1】:
您可以将向量列表作为 kruskal.test 的第一个参数传递
data_list <- structure(list(tumor = c(0.00425504, 0.002703172, 0.007478089,
0.003554968, 0.003803952, 0.005225325, 0.004816366, 0.00567434,
0.003474605, 0.004784456), t = c(0.004326186, 0.008126497, 0.00911083,
0.004030094, 0.005784066, 0.006752136, 0.009840556), b = c(0.004872971,
0.009066809, 0.005964638, 0.003622466, 0.011660714), caf = c(0.003618611,
0.007463386, 0.007463134, 0.005453387, 0.01040964, 0.012020965)),
.Names = c("tumor", "t", "b", "caf"))
kruskal.test(data_list)
# Kruskal-Wallis rank sum test
# data: data_list
# Kruskal-Wallis chi-squared = 7.0828, df = 3, p-value = 0.0693
【讨论】:
谢谢你,尽管我不想重新创建我的庞大数据文件。【参考方案2】:data_list <- list(
tumor = c(0.004255040, 0.002703172, 0.007478089, 0.003554968, 0.003803952, 0.005225325, 0.004816366, 0.005674340, 0.003474605, 0.004784456),
t = c(0.004326186, 0.008126497, 0.009110830, 0.004030094, 0.005784066, 0.006752136, 0.009840556),
b = c(0.004872971, 0.009066809, 0.005964638, 0.003622466, 0.011660714),
caf = c(0.003618611, 0.007463386, 0.007463134, 0.005453387, 0.010409640, 0.012020965))
library(purrr)
# transform list to dataframe
df = map2_df(names(data_list), # get names of each sublist
data_list, # get the list values
~ data.frame(type=.x, value=.y, stringsAsFactors = F)) # create a dataset with two columns
# apply the test
kruskal.test(value ~ factor(type), data = df)
# Kruskal-Wallis rank sum test
#
# data: value by factor(type)
# Kruskal-Wallis chi-squared = 7.0828, df = 3, p-value = 0.0693
【讨论】:
太棒了!谢谢!以上是关于R中列表子列表之间的Kruskal-Wallis测试的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 中获得 Kruskal-Wallis 检验的精确 p 值?
如何计算 R 中 epsilon-squared(Kruskal-Wallis 检验的效应大小)的置信区间?
带有调整 p 值的 R 的 Kruskal-Wallis 检验