比较两组以上的多个变量 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 检验的陷阱。
我尝试进行 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 检验的陷阱。