Как рассчитать парный t-тест для одного столбца во фрейме данных для всех остальных столбцов в одном операторе, используя R - PullRequest
0 голосов
/ 07 марта 2020

У меня есть фрейм данных с примерно 20 различными столбцами данных. Первый столбец имеет две опции: результат равен true или false.

Я хочу провести парное тестирование t.test между первым столбцом и остальными для в общей сложности 19 тестов, с целью ранжирования того, насколько хорошо эти остальные 19 столбцов могут предсказать истинное значение.

Я надеюсь, что есть способ по сути l oop через столбцы, сохраняя первый столбец все время.

Это будет выполнять итерацию по столбцам слева направо, но не будет сохранять первый столбец (a) stati c все время при увеличении второго столбца. Такие как A & B, B & C, C & D и др. c.

Код:

tests = lapply(seq(1,(length(df)-1)),function(x){t.test(df[,x],df[,x+1])}) 

Вместо этого я хочу: A & B, A & C, A & D и др. c.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Мне интересно, действительно ли вы хотите провести непарный t-тест. Причина, по которой я говорю это, заключается в том, что вы описали первый столбец как ИСТИНА или ЛОЖЬ, а затем сказали, что ваша цель состояла в том, чтобы увидеть, насколько хорошо другие столбцы могут предсказать значение ИСТИНА. Или, другими словами, значительно ли отличаются значения 19 других столбцов между группами ИСТИНА и ЛОЖЬ. Если вы действительно хотели сделать парный t-тест, то ваши данные, как описано, не совсем в правильном формате. Если вы не хотите сравнить x2 и x3 или x3 и x4 et c. Затем вы будете использовать следующее:

t.test(df$x2, df$x3, paired=TRUE)

Выполнение t-тестов непарный для второго столбца с первым столбцом, поскольку групповая переменная достигается с помощью метода формулы. Например, чтобы сравнить средние значения второй переменной между группами ИСТИНА и ЛОЖЬ, вы можете выполнить:

t.test(x1 ~ group, data=df)

И это непарный t-тест из двух выборок. Это также может быть сделано немного по-разному по причинам, которые станут очевидны позже.

t.test(df$x1 ~ df$group)
t.test(df[,2] ~ df[,1])

Последняя версия позволяет затем выполнять повторные тесты с использованием функции lapply, как упомянуто.

tests <- lapply(2:20, function(x) t.test(df[,x] ~ df[,1]))

Возвращает список без имени, который может быть назван с использованием имен фрейма данных.

names(tests) <- names(df)[2:20]
tests[1]

$x1

    Welch Two Sample t-test

data:  df[, x] by df[, 1]
t = -0.83536, df = 94.695, p-value = 0.4056
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.339658  2.176944
sample estimates:
mean in group FALSE  mean in group TRUE 
           48.46547            50.04683

Вы также можете убрать его, используя пакет broom .

lapply(tests,  broom::tidy)

$x1
# A tibble: 1 x 10
  estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high method      alternative
     <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl> <chr>       <chr>      
1    -1.58      48.5      50.0    -0.835   0.406      94.7    -5.34      2.18 Welch Two ~ two.sided  

Версия dplyr будет использовать функцию do вместо lapply, но сначала кадр данных необходимо привести в длинный формат.

library(dplyr)
library(tidyr)

df %>% pivot_longer(cols=starts_with("x")) %>%
  group_by(name) %>%
  do(tidy(t.test(.$value ~ .$group)))

# A tibble: 19 x 11
# Groups:   name [19]
   name  estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
   <chr>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl>
 1 x1     -1.58        48.5      50.0   -0.835   0.406       94.7   -5.34      2.18 
 2 x10    -0.377       49.3      49.6   -0.194   0.847       95.1   -4.24      3.49 
 3 x11     4.49        53.1      48.6    2.08    0.0400      97.8    0.209     8.77 
 4 x12    -1.05        51.1      52.2   -0.450   0.654       88.9   -5.70      3.59 
 5 x13    -0.743       49.4      50.1   -0.360   0.720       96.8   -4.84      3.35 
 6 x14     0.908       51.5      50.6    0.487   0.627       93.3   -2.79      4.61 

Данные :

set.seed(123)
n <- 100; m=19  # number of subjects (rows) and number of "x" columns
X <- data.frame(matrix(rnorm(n*m, mean=50, sd=10), byrow=TRUE, nc=m))
colnames(X) <- paste0("x", 1:19)
df <- data.frame(group=sample(c(TRUE, FALSE), size=n, replace=TRUE), X)
str(df)

'data.frame':   100 obs. of  20 variables:
 $ group: logi  FALSE FALSE FALSE FALSE TRUE FALSE ...
 $ x1   : num  44.4 45.3 46.9 55.8 47.2 ...
 $ x2   : num  47.7 39.3 46.2 51.2 37.8 ...
 $ x3   : num  65.6 47.8 43.1 52.2 51.8 ...
 $ x4   : num  50.7 39.7 47.9 53.8 48.6 ...
 $ x5   : num  51.3 42.7 37.3 45 50.1 ...
 $ x6   : num  67.2 43.7 71.7 46.7 53.9 ...
0 голосов
/ 07 марта 2020

Как отмечается в комментариях, это t-тест из двух выборок, а не парный t-тест, если только вы не добавите paired=TRUE, но он фиксирует первый столбец и проходит через остальные:

tests <- lapply(seq(2, length(df)), function(x){t.test(df[,1], df[,x])})

Если вы используете первый столбец для определения двух групп, то это будет выглядеть следующим образом:

tests <- lapply(seq(2, length(df)), function(x){t.test(df[,x]~df[,1])})

Это будет t-тест из двух выборок, каждый столбец будет разбит на две группы, определенные в столбце 1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...