Pregunta

Quiero realizar un ANOVA entre objetos que están almacenados en dos listas separadas, sin embargo, en lugar de realizarlos uno a la vez como este

> anova(output.02[[1]], output.03[[1]])
               Model df      AIC      BIC    logLik   Test  L.Ratio p-value
output.02[[1]]     1  9 11221.77 11279.72 -5601.884                        
output.03[[1]]     2 13 11222.90 11306.60 -5598.450 1 vs 2 6.868822   0.143

> anova(output.02[[2]], output.03[[2]])
           Model df      AIC      BIC    logLik   Test  L.Ratio p-value
output.02[[2]]     1  9 10976.36 11034.31 -5479.182                        
output.03[[2]]     2 13 10974.90 11058.60 -5474.449 1 vs 2 9.465378  0.0505

Me gustaría usar un bucle para realizar un ANOVA entre los objetos de cada lista.Intenté usar la función mapply, pero el resultado no produjo los resultados que esperaba.

> mapply(anova, output.02, output.03)
        zimmrec   zdelrec   zdigiback zspotword zsdmt     zglobcog  zmmse    
call    factor,2  factor,2  factor,2  factor,2  factor,2  factor,2  factor,2 
Model   Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
df      Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
AIC     Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
BIC     Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
logLik  Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
Test    factor,2  factor,2  factor,2  factor,2  factor,2  factor,2  factor,2 
L.Ratio Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
p-value Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2

¿Alguna sugerencia sobre cómo puedo hacer esto?

Gracias

Editar:Ejemplo reproducible

attach(Orthodont)
set.seed(1234)

#example response variables 
Orthodont$v1 <- rnorm(n=108, mean=20, sd=1)
Orthodont$v2 <- rnorm(n=108, mean=31, sd=2.8)
Orthodont$v3 <- rnorm(n=108, mean=15, sd=1.5)
head(Orthodont)

#function to loop the response variables through a lme function
#produces first batch of models
myfunc <- function(X){
  lapply(X, function(.col){
    y <- .col
    out <- with(Orthodont, lme(y ~ age, random = ~ age | Subject, method = "ML", na.action = na.exclude, control = lmeControl(opt = "optim")))    
    out 
  })
}
output.02 <- myfunc(Orthodont[5:7]) #first list of models 

myfunc2 <- function(X){
  lapply(X, function(.col){
    y <- .col
    out <- with(Orthodont, lme(y ~ age + Sex, random = ~ age | Subject, method = "ML", na.action = na.exclude, control = lmeControl(opt = "optim")))    
    out 
  })
}
output.03 <- myfunc2(Orthodont[5:7])# second list of models

#anova for each pair of models 
anova(output.02[[1]], output.03[[1]])
anova(output.02[[2]], output.03[[2]])
anova(output.02[[3]], output.03[[3]])

#mapply function
mapply(anova, output.02, output.03) 
¿Fue útil?

Solución

Utilizar el SIMPLIFY parámetro:

mapply(anova, output.02, output.03, SIMPLIFY=FALSE) 
#$v1
#                 Model df      AIC      BIC    logLik   Test   L.Ratio p-value
#dots[[1L]][[1L]]     1  6 324.4204 340.5132 -156.2102                         
#dots[[2L]][[1L]]     2  7 326.2229 344.9978 -156.1115 1 vs 2 0.1974693  0.6568
#
#$v2
#                 Model df      AIC      BIC    logLik   Test  L.Ratio p-value
#dots[[1L]][[2L]]     1  6 524.0956 540.1884 -256.0478                        
#dots[[2L]][[2L]]     2  7 525.7577 544.5326 -255.8788 1 vs 2 0.337934   0.561
#
#$v3
#                 Model df      AIC      BIC    logLik   Test  L.Ratio p-value
#dots[[1L]][[3L]]     1  6 387.4002 403.4930 -187.7001                        
#dots[[2L]][[3L]]     2  7 389.1333 407.9082 -187.5667 1 vs 2 0.266947  0.6054

Otros consejos

Podrías usar sapply

MyRes <- sapply(1:length(output.02), function(x) {
    anova(output.02[[x]], output.03[[x]])})
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top