ANOVA بين الكائنات في قائمتين
سؤال
أرغب في إجراء تحليل ANOVA بين الكائنات المخزنة في قائمتين منفصلتين، ولكن بدلاً من تنفيذها واحدًا تلو الآخر مثل هذا
> 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
أرغب في استخدام حلقة لإجراء ANOVA بين الكائنات الموجودة في كل قائمة.لقد حاولت استخدام الدالة Mapply ولكن الإخراج لم ينتج النتائج التي كنت أتوقعها.
> 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
هل هناك أي اقتراحات حول كيف يمكنني القيام بذلك؟
شكرًا
يحرر:مثال قابل للتكرار
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)
المحلول
استخدم ال SIMPLIFY
معامل:
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
نصائح أخرى
يمكنك استخدام sapply
MyRes <- sapply(1:length(output.02), function(x) {
anova(output.02[[x]], output.03[[x]])})
لا تنتمي إلى StackOverflow