用Tukey的测试比较来表示R中的循环

时间:2014-05-07 23:25:56

标签: r for-loop foreach statistics anova

以下是数据的示例:

metabolite  treatment area
x           A         1
x           B         2
x           C         3
y           A         4
y           B         5
y           C         6
z           A         7
z           B         8
z           C         9
x           A         12
x           B         22
x           C         32
y           A         42
y           B         52
y           C         62
z           A         72
z           B         82
z           C         92

对于每种代谢物,我想测试治疗的平均面积是否不同。 换句话说:

代谢物X :A对B,A对C,B对C 代谢物Y :A对B,A对C,B对C 代谢物Z :A对B,A对C,B对C

我需要在R中进行Tukey测试(http://en.wikipedia.org/wiki/Tukey%27s_range_test),这将对治疗进行每次成对比较(A与B,A与C,C与B)。这是我提出的,但它不起作用。

`for (i in levels(data$metabolite)) { 
tukey_part1 <- aov(data$area ~ data$treatment)
tukey_part2 <- TukeyHSD(x=tukey_part1, 'data$treatment', conf.level=0.95) 
                             } `

请帮助!

1 个答案:

答案 0 :(得分:1)

好吧,您实际上从未尝试过使用正在循环的i变量。我继续将for循环改为使用lapply。这个怎么样

res<-lapply(levels(data$metabolite), function(i) {
    met<-data[data$metabolite==i, ]  #subset for metabolite i
    part1<-with(met, aov(area ~ treatment))
    print(part1)
    list( 
        part1 = part1,
        part2 = TukeyHSD(x=part1, 'treatment', conf.level=0.95)
    )
})
names(res)<-levels(data$metabolite)

这将为您提供一个或多个列表,其中包含您要查找的部分。例如,您可以使用res[[_metabolite_]][[_part_]]提取结果,例如......

res[["x"]][["part1"]]
res[["y"]][["part2"]]