Сравнение нескольких переменных в более чем двух группах с t.test - PullRequest
0 голосов
/ 16 декабря 2018

Я попытался сделать 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, чтобы получить результаты ваккуратный формат.Мои подходы, очевидно, не работают, любой совет очень важен для улучшения моих кодов.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Альтернативным маршрутом будет определение функции с необходимыми опциями для t.test (), а затем создание фреймов данных для каждой пары переменных (т. Е. Каждой комбинации «time *» и «threshold») и вложенностиих в столбцы списка и использовать map () в сочетании с соответствующими функциями из «метлы», чтобы упростить результаты.

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)

Однако мне неясно, что вы хотите сделать с помощью «условия», поэтому яИнтересно, проще ли переформулировать вопрос в терминах GLM (как Камилла предложила в комментариях: ANOVA является частью семейства GLM).

Измените данные, определите «порог» как опорный уровень фактора «время», и контрасты «обработки» по умолчанию, используемые R, будут сравнивать каждый раз с «порогом»:

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-тестов на одном наборе данных.

0 голосов
/ 16 декабря 2018

Мы могли бы удалить threshold из select и затем снова ввести его, создав data.frame, который перешел бы в объект формулы t.test

library(tidyverse)
time1.df %>% 
   select_if(is.numeric) %>% 
   select(-threshold) %>%
   map_df(~ data.frame(time = .x, time1.df['threshold']) %>% 
           broom::tidy(t.test(. ~ threshold)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...