For Loop t.test, Сравнение средних по классу факторов в R - PullRequest
0 голосов
/ 12 января 2019

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

Мои данные структурированы так:


df <- data.frame("crop" = rep(c('Beans', 'Corn', 'Potatoes'), 10),
                 "value" = rnorm(n = 30),
                 "pattern" = rep(c("mono", "inter"), 15),
                 stringsAsFactors = TRUE)

Мне бы хотелось, чтобы выходные данные предоставили результаты t.test, сравнивающего средний урожай каждой культуры по схеме (т. Е. Сравнивают урожай монообрезанного картофеля с пересеченным картофелем), где альтернативой является большее значение для пересеченного образца.

Помощь!

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Вот изящный подход "tidyverse", который использует функцию tidy из broom, которая позволяет вам сохранять результаты t-теста в качестве фрейма данных.

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

library(dplyr)
library(broom)

# Generate example data
  df <- data.frame("crop" = rep(c('Beans', 'Corn', 'Potatoes'), 10),
                   "value" = rnorm(n = 30),
                   "pattern" = rep(c("inter", "mono"), 15),
                   stringsAsFactors = TRUE)

# Group the data by crop, and run a t-test for each subset of data.
# Use the tidy function from the broom package
# to capture the t.test output as a data frame

  df %>% 
    group_by(crop) %>% 
    do(tidy(t.test(formula = value ~ pattern,
                   data = .,
                   alternative = 'greater')))
0 голосов
/ 12 января 2019

Рассмотрим by, объектно-ориентированную оболочку для tapply, предназначенную для подстановки фрейма данных с помощью фактора (ов) и выполнения операций над подмножествами:

t_test_list <- by(df, df$crop, function(sub) 
                   t.test(formula = value ~ pattern,
                          data = sub, alternative = 'greater')
                 )
0 голосов
/ 12 января 2019

Вот пример использования базы R.

# Generate example data
df <- data.frame("crop" = rep(c('Beans', 'Corn', 'Potatoes'), 10),
                 "value" = rnorm(n = 30),
                 "pattern" = rep(c("inter", "mono"), 15),
                 stringsAsFactors = TRUE)

# Create a list which will hold the output of the test for each crop
  crops <- unique(df$crop)
  test_output <- vector('list', length = length(crops))
  names(test_output) <- crops

# For each crop, save the output of a one-sided t-test
  for (crop in crops) {
    # Filter the data to include only observations for the particular crop
    crop_data <- df[df$crop == crop,]
    # Save the results of a t-test with a one-sided alternative
    test_output[[crop]] <- t.test(formula = value ~ pattern,
                                  data = crop_data,
                                  alternative = 'greater')
  }

Важно отметить, что при вызове t-test с интерфейсом формулы (например, y ~ x) и где ваша независимая переменная является фактором, тогда при использовании настройки alternative = 'greater' будет проверяться, имеется ли среднее значение в нижнем уровне фактора ( в случае ваших данных "inter") больше среднего значения на более высоком уровне фактора (здесь это "mono").

...