比较两组以上的多个变量 t.test

Comparing multiple variables in more than two groups with t.test

我尝试进行 t 检验,比较 time1/2/3.. 和阈值之间的值。 这是我的数据框:

time.df1<-data.frame("condition" =c("A","B","C","A","C","B"), 
"time1" = c(1,3,2,6,2,3) ,
"time2" = c(1,1,2,8,2,9) ,
"time3" = c(-2,12,4,1,0,6),
"time4" = c(-8,3,2,1,9,6),
"threshold" = c(-2,3,8,1,9,-3))

我尝试通过以下方式比较每两个值:

time.df1%>% 
select_if(is.numeric)  %>%
purrr::map_df(~ broom::tidy(t.test(. ~ threshold)))

但是,我收到了这条错误消息

 Error in eval(predvars, data, env) : object 'threshold' not found

所以,我尝试了另一种方式(可能是错误的)

time.df2<-time.df1%>%gather(TF,value,time1:time4)
time.df2%>% group_by(condition) %>% do(tidy(t.test(value~TF, data=.)))

遗憾的是,我遇到了这个错误。即使我将条件限制为只有两个级别 (A,B)

 Error in t.test.formula(value ~ TF, data = .) : grouping factor must have exactly 2 levels

我希望在每个时间列上循环 t 检验到每个条件的阈值列,然后使用 broom::tidy 以整洁的格式获得结果。我的方法显然不起作用,非常感谢任何改进我的代码的建议。

我们可以从 select 中删除 threshold,然后通过创建一个 data.frame 重新引入它,它将进入 t.test[=15= 的公式对象]

library(tidyverse)
time1.df %>% 
   select_if(is.numeric) %>% 
   select(-threshold) %>%
   map_df(~ data.frame(time = .x, time1.df['threshold']) %>% 
           broom::tidy(t.test(. ~ threshold)))

另一种方法是预先定义一个具有 t.test() 所需选项的函数,然后为每对变量(即 'time*' 和 'threshold') 并将它们嵌套到列表列中,并使用 map() 结合 'broom' 中的相关函数来简化输出。

library(tidyverse)
library(broom)

ttestfn <- function(data, ...){
  # amend this function to include required options for t.test
  res = t.test(data$resp, data$threshold)
  return(res)
}   

df2 <-   
time.df1 %>% 
  gather(time, "resp", - threshold, -condition) %>% 
  group_by(time) %>% 
  nest() %>% 
  mutate(ttests = map(data, ttestfn),
         glances = map(ttests, glance))
# df2 has data frames, t-test objects and glance summaries 
# as separate list columns

现在很容易查询这个对象来提取你想要的东西

df2 %>% 
unnest(glances, .drop=TRUE)

但是,我不清楚你想用 'condition' 做什么,所以我想知道根据 GLM 重新构建问题是否更直接(正如 camille 在评论中建议的那样: ANOVA 是 GLM 家族的一部分)。

重塑数据,将'threshold'定义为'time'因子的参考水平,R使用的默认'treatment'对比每次都会与'threshold'进行比较:

time.df2 <- 
  time.df1 %>% 
  gather(key = "time", value = "resp", -condition) %>% 
  mutate(time = fct_relevel(time, "threshold")) # define 'threshold' as baseline

fit.aov <- aov(resp ~ condition * time, data = time.df2)
summary(fit.aov)
summary.lm(fit.aov) # coefficients and p-values

当然这是假设所有受试者都是独立的(即没有重复测量)。如果没有,那么您将需要继续执行更复杂的程序。无论如何,为研究设计转向适当的 GLM 应该有助于最大程度地减少对同一数据集进行多个 t 检验的陷阱。