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 !
3 Réponses :
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").
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.
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')))
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!
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')
)