我有一个简单的数据集,我想使用aov
和tidyverse
迭代因变量。从那些输出,我然后想要计算Tukey HSD
测试。我有一个for循环结构的工作,但我正在努力从这种心态迁移。我在使用自变量迭代aov
函数时看到了this post。试图将这个逻辑融入我的工作流程,但没有那么好。任何可以引导我朝正确方向前进的tidyverse
爱好者?
library(tidyverse)
library(data.table)
pfuel <- fread("data/CFL.csv") %>%
mutate(AFCL = AFCL*10,
LCW = LCW*10,
DCW = DCW*10,
LiDe = ifelse(Status == "Li", "Live", "Dead")) %>%
filter(S.F == "S") %>%
group_by(Site, Year, Age, Plot) %>%
select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr) %>%
summarise_all(sum) %>%
ungroup() %>%
mutate(sb_age = paste0(Year, Age))
aov.models = pfuel %>%
select (-c(Year, Age)) %>%
select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr, Site, Plot, sb_age) %>%
map(~ aov(.x ~ sb_age + Site/Plot, data = pfuel))
当aov.models
运行时,我生成此错误:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
NA/NaN/Inf in 'y'
In addition: Warning message:
In model.response(mf, "numeric") : NAs introduced by coercion
我还没有接受过Tukey测试,因为我无法通过aov功能。任何建议将不胜感激!
您可以在此处找到数据:https://www.dropbox.com/s/yb8rh860fc7fff2/CFL.csv?dl=0
谢谢!
答案 0 :(得分:1)
将数据转换为长格式,按响应分割,然后拟合模型并将输出提供给HSD.test
函数可能更容易,例如
aov.models <- pfuel %>%
select(-Year, -Age) %>%
gather(variable, value, -sb_age, -Site, -Plot) %>%
split(.$variable) %>%
map(~ aov(value ~ sb_age + Site/Plot, data = .x)) %>%
map(HSD.test, trt = 'sb_age')
我还删除了其中一个select()
语句,因为它选择了所有列。
答案 1 :(得分:0)
@ Z.Lin在你的指导下,我找到了问题第一部分的解决方案。可能不是最优雅的,但至少它现在正在工作!任何改进都会受到欢迎,但谢谢。
pfuel_var <- pfuel %>%
select(Site, Plot, sb_age) %>%
mutate(Site = as.factor(Site),
Plot = as.factor( Plot),
sb_age = as.factor(sb_age))
aov.models <- pfuel %>%
select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr) %>%
map(~ aov(.x ~ pfuel_var$sb_age + pfuel_var$Site/pfuel_var$Plot, data = pfuel))
我的问题的第二部分是如何将此输出从HSD.test
包中提供给agricolae
。有人对此有什么看法吗?
我的想法是:
t <- aov.models %>%
map(~ HSD.test(.x, "pfuel_var$sb_age", alpha=0.1))
但这不能正常工作。非常感谢。