En las orugas, ¿es la dieta más importante que el tamaño en la resistencia a los depredadores?

8

Estoy tratando de determinar si las orugas que comen una dieta natural (monkeyflower) son más resistentes a los depredadores (hormigas) que las orugas que comen una dieta artificial (una mezcla de germen de trigo y vitaminas). Hice un estudio de prueba con un tamaño de muestra pequeño (20 orugas; 10 por dieta). Pesé cada oruga antes del experimento. Ofrecí un par de orugas (una por dieta) a un grupo de hormigas por un período de cinco minutos, y conté el número de veces que cada oruga fue rechazada. Repetí este proceso diez veces.

Así son mis datos (A = dieta artificial, N = dieta natural):

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

Estoy tratando de ejecutar un ANOVA en R. Así es como se ve mi código (0 = Dieta artificial, 1 = Dieta natural; todos los vectores están organizados con datos de las diez orugas de dieta artificial primero, seguidos de los datos de la dieta diez natural. orugas):

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)  

Y así son mis resultados:

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 

Mis preguntas son:

  • ¿Es apropiado ANOVA aquí? Me doy cuenta de que el pequeño tamaño de la muestra sería un problema con cualquier prueba estadística; este es solo un estudio de prueba en el que me gustaría ejecutar estadísticas para una presentación de clase. Planeo rehacer este estudio con un tamaño de muestra más grande.
  • ¿He introducido mis datos en R correctamente?
  • ¿Me está diciendo que la dieta es importante, pero el peso no?
maullar
fuente
77
Dado que el peso se confunde por completo con la dieta, los de la dieta natural son uniformemente más pesados ​​que los de la dieta artificial, es difícil ver cómo se puede concluir algo sobre la relación entre uno de esos y los rechazos.
whuber
Si, estoy de acuerdo contigo. Cuando vuelva a hacer esto, planeo alimentar a todas las orugas con dietas artificiales (una con aleloquímicos aislados) para que crezcan al mismo ritmo.
Miau

Respuestas:

14

tl; dr @whuber tiene razón en que la dieta y el peso se confunden en su análisis: así es como se ve la imagen.

ingrese la descripción de la imagen aquí

Los puntos gordos + rangos muestran los intervalos de confianza medios y de arranque para la dieta sola; la línea gris + intervalo de confianza muestra la relación general con el peso; Las líneas individuales + IC muestran las relaciones con el peso para cada grupo. Hay más rechazo por la dieta = N, pero esas personas también tienen pesos más altos.

Entrando en los detalles mecánicos sangrientos: está en el camino correcto con su análisis, pero (1) cuando prueba el efecto de la dieta, debe tener en cuenta el efecto del peso, y viceversa ; por defecto, R realiza un ANOVA secuencial , que prueba el efecto de la dieta sola; (2) para datos como este, probablemente debería utilizar un modelo lineal generalizado de Poisson (GLM), aunque no hace mucha diferencia en las conclusiones estadísticas en este caso.

Si observa en summary()lugar de anova(), lo que prueba los efectos marginales, verá que nada parece particularmente significativo (también debe tener cuidado al probar los efectos principales en presencia de una interacción: en este caso, el efecto de la dieta se evalúa en un peso de cero : probablemente no sea sensato, pero dado que la interacción no es significativa (¡aunque tiene un gran efecto!) puede que no haga mucha diferencia.

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

Centrar la variable de peso:

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

No hay grandes cambios en la historia aquí.

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               

Existe algún argumento sobre si las llamadas pruebas "tipo 3" tienen sentido; no siempre, aunque centrar el peso ayuda. El análisis de tipo 2, que prueba los efectos principales después de eliminar la interacción del modelo, puede ser más defendible. En este caso, la dieta y el peso se prueban en presencia mutua, pero sin las interacciones incluidas.

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                  

Podemos ver que si analizamos la dieta ignorando los efectos del peso obtendríamos un resultado muy significativo: esto es esencialmente lo que encontró en su análisis, debido al ANOVA secuencial.

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                    

Sería más estándar ajustar este tipo de datos a un Poisson GLM ( glm(rejections~diet*cweight,data=dd2,family=poisson)), pero en este caso no hay mucha diferencia en las conclusiones.

Por cierto, es mejor reorganizar sus datos mediante programación en lugar de hacerlo a mano si puede. Como referencia, así es como lo hice (perdón por la cantidad de "magia" que usé):

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

Código de trazado:

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
fuente
2
Muchas gracias por su ayuda. No me di cuenta de que ANOVA es secuencial e ignora el peso en este caso, ¡es bueno saberlo!
Miau