0
votes

For Loop t.test, comparaison des moyennes par classe de facteur dans R

Je veux boucler un grand nombre de tests t unilatéraux, en comparant la valeur moyenne de la récolte par modèle pour un ensemble de cultures différentes.

Mes données sont structurées comme ceci:

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

Je voudrais que la sortie fournisse les résultats d'un t.test, comparant la récolte moyenne de chaque culture par modèle (c.-à-d. récolte de pommes de terre monoculture à pommes de terre associées), où l'alternative est une plus grande valeur pour le modèle de culture intercalaire.

Aide !


0 commentaires

3 Réponses :


0
votes

Voici un exemple utilisant la base 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')
  }

Il est important de noter que lors de l'appel de t-test avec l'interface de formule (par exemple y ~ x ) et où votre variable indépendante est un facteur, alors l'utilisation du paramètre alternative = 'greater' testera si la moyenne au niveau de facteur inférieur (dans le cas de vos données, "inter" ) est supérieur à la moyenne du niveau de facteur supérieur (ici, c'est "mono").


3 commentaires

Merci! C'est parfait


L'utilisation de par pourrait éliminer unique , vecteur , noms , pour et [ lignes!


C'est une excellente suggestion. Je pense qu'il serait utile d'ajouter cela comme réponse à la question.



0
votes

Voici l’approche élégante "tidyverse", qui utilise la fonction tidy de balai qui vous permet de stocker la sortie d’un test t sous forme de trame de données .

Au lieu d'une boucle for formelle, les fonctions group_by et do du package dplyr sont utilisées pour accomplir la même chose qu'un for boucle.

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')))


2 commentaires

Oui! J'étais si proche de ça plus tôt. Merci de votre aide.


Absolument. Bonne chance pour résoudre votre problème d'analyse!



0
votes

Considérez by , un wrapper orienté objet pour tapply conçu pour sous-ensemble un bloc de données par facteur (s) et exécuter des opérations sur des sous-ensembles:

t_test_list <- by(df, df$crop, function(sub) 
                   t.test(formula = value ~ pattern,
                          data = sub, alternative = 'greater')
                 )


0 commentaires