2015-09-30 1 views
1

Dans un projet où j'effectue une modélisation à effets mixtes en utilisant lme, j'essaie de comparer des modèles avec différentes structures de corrélation les pièces. Comme je vais construire beaucoup de ces modèles (pour différentes variables dépendantes), j'ai essayé d'écrire une fonction pour générer une liste de modèles avec différentes structures de corrélation, comme dans l'exemple ci-dessous (j'ai vraiment essayé de le garder au minimum exemple de travail).Scoping-related (?): Anova() sur la liste des modèles à effets mixtes créés

Si je lance un anova() sur les éléments de cette liste, cela fonctionne, mais seulement si fixedPart est dans mon environnement global. pourquoi est-ce le cas? Est-il un moyen de contourner ce problème, de sorte que je peux simplement garder m et ré-utiliser/supprimer fixedPart?

Je suppose que ce problème est lié à la portée (lexique) en R, mais je ne peux pas trouver un moyen de fixer réellement.

Merci d'avance!

#Dependencies 
library(multilevel) 
library(multcomp) 

#Generate sample data 
nVals = 100 
sData = rnorm(nVals, mean = 1, sd = 1) 
dF <- data.frame(nSubject = 1:nVals, 
       v1data = sData + rnorm(nVals, mean = 0, sd = 0.1), 
       v2data = sData + rnorm(nVals, mean = 0, sd = 0.1), 
       v3data = sData + rnorm(nVals, mean = 0, sd = 0.4)) 
dLongF = reshape(data=dF, varying=c("v1data","v2data","v3data"), v.names='data', direction="long", idvar="nSubject", times=1:3) 

#Define function to assess different covariance structures 
doAllCorrModels <- function(dataF, subjVarName, visitVarName, fixedPart){ 
    mList <- vector("list",2) 
    mList[[1]] <- lme(fixedPart, #Random intercept, homogeneous variance 
      random=as.formula(paste("~1|", subjVarName)), 
      data=dataF, 
      weights=NULL) 
    mList[[2]] <- lme(fixedPart, #Random intercept, heterogeneous variance 
      random=as.formula(paste("~1|", subjVarName)), 
      data=dataF, 
      weights=varIdent(form = as.formula(paste("~1|", visitVarName))) 
    ) 
    mList 
} 

#Get different covariance structures 
dataF <- dLongF 
subjVarName <- "nSubject" 
visitVarName <- "time" 
fixedPart <- data ~ time 
m <- doAllCorrModels(dataF, subjVarName, visitVarName, fixedPart) 

#This works: 
a1 <- anova(m[[1]], m[[2]]) 

#But this does not: 
rm(fixedPart) 
a2 <- anova(m[[1]], m[[2]]) 

Répondre

0

Vous pouvez éviter cela en utilisant do.call:

doAllCorrModels <- function(dataF, subjVarName, visitVarName, fixedPart){ 
    mList <- vector("list",2) 
    mList[[1]] <- do.call(lme, list(fixed = fixedPart, 
            random=as.formula(paste("~1|", subjVarName)), 
            data=dataF, 
            weights=NULL)) 

    mList[[2]] <- do.call(lme, list(fixed = fixedPart, 
            random=as.formula(paste("~1|", subjVarName)), 
            data=dataF, 
            weights=varIdent(form = as.formula(paste("~1|", visitVarName))))) 
    mList 
} 
+0

Grand, qui fonctionne! Pourriez-vous m'expliquer ** pourquoi ** cela fonctionne réellement, et pourquoi l'ancien code n'a pas? Merci! – Trabantje

+0

@Trabantje Comparez 'm [[1]] $ call' après avoir exécuté les deux. Vous verrez que l'utilisation de 'do.call' s'assure que toutes les parties de l'appel sont réellement là et n'ont pas besoin d'être récupérées depuis un environnement comme c'est le cas avec votre méthode où' fixedPart' fait partie de la formule dans l'appel du modèle. – Roland