Chez les chenilles, le régime alimentaire est-il plus important que la taille dans la résistance aux prédateurs?

8

J'essaie de déterminer si les chenilles qui ont une alimentation naturelle (fleur de singe) sont plus résistantes aux prédateurs (fourmis) que les chenilles qui ont une alimentation artificielle (un mélange de germe de blé et de vitamines). J'ai fait une étude d'essai avec un petit échantillon (20 chenilles; 10 par régime). J'ai pesé chaque chenille avant l'expérience. J'ai offert une paire de chenilles (une par régime) à un groupe de fourmis pendant une période de cinq minutes et j'ai compté le nombre de fois que chaque chenille a été rejetée. J'ai répété ce processus dix fois.

Voici à quoi ressemblent mes données (A = alimentation artificielle, N = alimentation naturelle):

Trial A_Weight   N_Weight   A_Rejections N_Rejections
1     0.0496     0.1857     0     1 
2     0.0324     0.1112     0     2
3     0.0291     0.3011     0     2
4     0.0247     0.2066     0     3
5     0.0394     0.1448     3     1
6     0.0641     0.0838     1     3
7     0.0360     0.1963     0     2
8     0.0243     0.145      0     3
9     0.0682     0.1519     0     3
10    0.0225     0.1571     1     0

J'essaie d'exécuter une ANOVA en R. Voici à quoi ressemble mon code (0 = régime artificiel, 1 = régime naturel; tous les vecteurs sont organisés avec les données des dix chenilles de régime artificiel en premier, suivies des données des dix régimes naturels les chenilles):

diet <- factor (rep (c (0, 1), each = 10) 
rejections <- c(0,0,0,0,3,1,0,0,0,1,1,2,2,3,1,3,2,3,3,0) 
weight <- c(0.0496,0.0324,0.0291,0.0247,0.0394,0.0641,0.036,0.0243,0.0682,0.0225,0.1857,0.1112,0.3011,0.2066,0.1448,0.0838,0.1963,0.145,0.1519,0.1571)   
all.data <- data.frame(Diet=diet, Rejections = rejections, Weight = weight)  
fit.all <- lm(Rejections ~ Diet * Weight, all.data)  
anova(fit.all)  

Et voici à quoi ressemblent mes résultats:

Analysis of Variance Table  

Response: Rejections  
            Df  Sum Sq Mean Sq F value   Pr(>F)    
Diet         1 11.2500 11.2500  9.8044 0.006444 ** 
Weight       1  0.0661  0.0661  0.0576 0.813432    
Diet:Weight  1  0.0748  0.0748  0.0652 0.801678    
Residuals   16 18.3591  1.1474                     
--- 
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Mes questions sont:

  • L'ANOVA est-elle appropriée ici? Je me rends compte que la petite taille de l'échantillon serait un problème avec tout test statistique; ce n'est qu'une étude d'essai sur laquelle j'aimerais exécuter des statistiques pour une présentation en classe. J'ai l'intention de refaire cette étude avec un plus grand échantillon.
  • Ai-je saisi correctement mes données dans R?
  • Est-ce que cela me dit que le régime alimentaire est important, mais pas le poids?
Miaou
la source
7
Étant donné que le poids est complètement confondu avec le régime alimentaire - ceux qui suivent un régime naturel sont uniformément plus lourds que ceux qui suivent un régime artificiel - il est difficile de voir comment vous pourriez conclure quoi que ce soit sur la relation entre l'un de ceux-ci et les rejets.
whuber
Oui je suis d'accord avec toi. Lorsque je refais cela, je prévois de nourrir tous les régimes artificiels des chenilles (un avec des allélochimiques isolés) afin qu'ils grandissent au même rythme.
Meow

Réponses:

14

tl; dr @whuber a raison de dire que l'alimentation et le poids sont confondus dans votre analyse: voici à quoi ressemble l'image.

entrez la description de l'image ici

Les points gras + fourchettes indiquent les intervalles de confiance moyens et bootstrap pour le régime seul; la ligne grise + intervalle de confiance montre la relation globale avec le poids; les lignes individuelles + CI montrent les relations avec le poids pour chaque groupe. Il y a plus de rejet pour le régime = N, mais ces individus ont également des poids plus élevés.

Entrer dans les détails mécaniques sanglants: vous êtes sur la bonne voie avec votre analyse, mais (1) lorsque vous testez l'effet du régime alimentaire, vous devez prendre en compte l'effet du poids, et vice versa ; par défaut, R fait une ANOVA séquentielle , qui teste l'effet du régime seul; (2) pour des données comme celle-ci, vous devriez probablement utiliser un modèle linéaire généralisé de Poisson (GLM), bien que cela ne fasse pas trop de différence avec les conclusions statistiques dans ce cas.

Si vous regardez summary()plutôt que anova(), qui teste les effets marginaux, vous verrez que rien ne semble particulièrement significatif (vous devez également faire attention à tester les effets principaux en présence d'une interaction: dans ce cas, l'effet du régime est évalué à un poids de zéro : probablement pas sensible, mais comme l'interaction n'est pas significative (bien qu'elle ait un effet important!), cela peut ne pas faire beaucoup de différence.

summary(fit.lm <- lm(rejections~diet*weight,data=dd2))
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept)    0.3455     0.9119   0.379    0.710
## dietN          1.9557     1.4000   1.397    0.182
## weight         3.9573    21.6920   0.182    0.858
## dietN:weight  -5.7465    22.5013  -0.255    0.802

Centrage de la variable de poids:

dd2$cweight <- dd2$weight-mean(dd2$weight)
summary(fit.clm <- update(fit.lm,rejections~diet*cweight))
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)     0.7559     1.4429   0.524    0.608
## dietN           1.3598     1.5318   0.888    0.388
## cweight         3.9573    21.6920   0.182    0.858
## dietN:cweight  -5.7465    22.5013  -0.255    0.802

Pas d'énormes changements dans l'histoire ici.

car::Anova(fit.clm,type="3")
## Response: rejections
##               Sum Sq Df F value Pr(>F)
## (Intercept)   0.3149  1  0.2744 0.6076
## diet          0.9043  1  0.7881 0.3878
## cweight       0.0382  1  0.0333 0.8575
## diet:cweight  0.0748  1  0.0652 0.8017
## Residuals    18.3591 16               

Certains se demandent si les tests dits de "type 3" ont un sens; ils ne le font pas toujours, bien que centrer le poids aide. L'analyse de type 2, qui teste les principaux effets après avoir retiré l'interaction du modèle, peut être plus défendable. Dans ce cas, l'alimentation et le poids sont testés en présence l'un de l'autre, mais sans les interactions incluses.

car::Anova(fit.clm,type="2")
## Response: rejections
##               Sum Sq Df F value  Pr(>F)  
## diet          4.1179  1  3.5888 0.07639 .
## cweight       0.0661  1  0.0576 0.81343  
## diet:cweight  0.0748  1  0.0652 0.80168  
## Residuals    18.3591 16                  

Nous pouvons voir que si nous analysions l'alimentation en ignorant les effets du poids, nous obtiendrions un résultat très significatif - c'est essentiellement ce que vous avez trouvé dans votre analyse, en raison de l'ANOVA séquentielle.

fit.lm_diet <- update(fit.clm,. ~ diet)
car::Anova(fit.lm_diet)
## Response: rejections
##           Sum Sq Df F value   Pr(>F)   
## diet       11.25  1  10.946 0.003908 **
## Residuals  18.50 18                    

Il serait plus standard d'adapter ce type de données à un GLM de Poisson ( glm(rejections~diet*cweight,data=dd2,family=poisson)), mais dans ce cas, cela ne fait pas beaucoup de différence dans les conclusions.

Soit dit en passant, il est préférable de réorganiser vos données par programme plutôt que manuellement si vous le pouvez. Pour référence, voici comment je l'ai fait (désolé pour la quantité de "magie" que j'ai utilisée):

library(tidyr)
library(dplyr)

dd <- read.table(header=TRUE,text=
"Trial A_Weight   N_Weight   A_Rejections N_Rejections
1     0.0496     0.1857     0     1 
2     0.0324     0.1112     0     2
3     0.0291     0.3011     0     2
4     0.0247     0.2066     0     3
5     0.0394     0.1448     3     1
6     0.0641     0.0838     1     3
7     0.0360     0.1963     0     2
8     0.0243     0.145      0     3
9     0.0682     0.1519     0     3
10    0.0225     0.1571     1     0
")

## pick out weight and rearrange to long format
dwt <- dd %>% select(Trial,A_Weight,N_Weight) %>%
    gather(diet,weight,-Trial) %>%
    mutate(diet=gsub("_.*","",diet))
## ditto, rejections
drej <- dd %>% select(Trial,A_Rejections,N_Rejections) %>%
    gather(diet,rejections,-Trial) %>%
    mutate(diet=gsub("_.*","",diet))
## put them back together
dd2 <- full_join(dwt,drej,by=c("Trial","diet"))

Code de traçage:

dd_sum <- dd2 %>% group_by(diet) %>%
   do(data.frame(weight=mean(.$weight),
              rbind(mean_cl_boot(.$rejections))))

library(ggplot2); theme_set(theme_bw())
ggplot(dd2,aes(weight,rejections,colour=diet))+
geom_point()+
scale_colour_brewer(palette="Set1")+
scale_fill_brewer(palette="Set1")+
geom_pointrange(data=dd_sum,aes(y=y,ymin=ymin,ymax=ymax),
                size=4,alpha=0.5,show.legend=FALSE)+
geom_smooth(method="lm",aes(fill=diet),alpha=0.1)+
geom_smooth(method="lm",aes(group=1),colour="darkgray",
            alpha=0.1)+
scale_y_continuous(limits=c(0,3),oob=scales::squish)
Ben Bolker
la source
2
Merci beaucoup pour votre aide. Je ne savais pas que l'ANOVA est séquentielle et ignore le poids dans ce cas - bon à savoir!
Meow