2017-06-20 2 views
0

Je souhaite exécuter la même séquence d'analyse RDA (ajustement d'un modèle, test de la signification du modèle, de l'axe et du terme, traçage des données) sur des sous-ensembles des mêmes jeux de données . Par conséquent, j'ai écrit une fonction. Le problème est maintenant que l'appel à la fonction anova.cca ne fonctionne pas bien dans une fonction lorsque je veux tester l'axe. Il ne peut pas trouver le jeu de données Y.subanova.cca ne trouve pas d'objet dans la fonction définie par l'utilisateur

Erreur dans eval (expr, Envir, Enclos): objet 'RV.sub' not found

exemple de travail minimal:

library(vegan) 
data(dune) 
data(dune.env) 

rda.subsetfunc <- function(RV, Y){ 
    #RV.sub <- subset(RV, !Y$Use%in%c("BF")) 
    #Y.sub <- subset(Y, !Y$Use%in%c("BF")) 
    RV.sub <- RV; Y.sub <- Y 
    rda.mod <- rda(RV.sub ~ Manure, Y.sub) 
    axis.test <- anova(rda.mod, by = "axis") 

    return(list(rda.mod, axis.test)) 
} 

rda.subsetfunc(RV = dune, Y = dune.env) 

J'ai trouvé quelques autres questions connexes comme here mais cela semble être beaucoup plus compliqué que ce que je fais. J'ai essayé d'implémenter l'approche do.call comme cela est mentionné here mais je n'ai pas réussi à le faire fonctionner. Si ce n'est vraiment pas possible de le faire sans vraiment creuser profondément dans les fonctions, je vais trouver un moyen de programmation autour d'elle. Mais pour moi, c'est comme si j'essayais de faire quelque chose qui prend tout son sens. Donc, il est probablement plus probable que je fasse quelque chose de mal que de faire quelque chose d'impossible.

+0

je fait une erreur stupide en tapant dans la question initiale. J'ai d'abord mis 'rda.subsetfunc (RV = dune, Y = Y.sub)' qui ne fonctionne pas pour des raisons évidentes. Merci à @ chi-pak pour m'avoir fait réaliser – Nightingale

+0

Ce n'est pas le problème car RV.sub est la matrice X et non une colonne de Y. C'est ainsi que fonctionne la fonction rda. Ma fonction fonctionne bien si j'omets la fonction anova. C'est celui qui cause le problème. J'apprécie vraiment votre aide d'ailleurs! – Nightingale

+0

De la page d'aide de rda. 'data (dune) data (dune.env) dune.Manure <- rda (dune ~ fumier, dune.env)' Donc, RV.sub n'étant pas dans Y est correct. – Nightingale

Répondre

1

Ceci est un problème de portée dans anova.cca (..., par = "axe") qui devrait trouver des éléments de plusieurs environnements différents lors de la mise à jour de la formule (je ne vais pas entrer dans les détails techniques). Vous ne pouvez vraiment pas intégrer la fonction pour analyser les significations des axes. C'est un problème connu. Nous avons résolu que dans la version de développement de vegan. La fonction redessinée dans https://github.com/vegandevs/vegan semblait fonctionner avec cet exemple. Toutes les fonctions d'ordination et de signification y sont radicalement changées, et elles ne sont pas encore complètement achevées. Nous prévoyons de les libérer dans le végétalien 2.5-0 au dernier trimestre de 2017, mais ils ne sont pas encore finis. Le problème est que anova.cca(..., by = "axis") doit trouver les éléments qu'il construit dans la fonction, et en plus il peut trouver les éléments qui étaient disponibles lorsque le modèle original a été construit, mais il ne peut pas trouver les éléments que vous générez dans les fonctions qui intègrent la fonction . Vous devez contourner cela en faisant votre fonction d'intégration pour écrire ses objets quelque part que ceux-ci peuvent être trouvés. La solution la plus simple (mais sale) consiste à les écrire dans l'environnement parent avec <<-. La version suivante de votre fonction ajoute cette <<- et semble fonctionner dans végétalien 2.4-3

rda.subsetfunc <- function(RV, Y){ 
    RV.sub <<- RV; Y.sub <- Y 
    rda.mod <- rda(RV.sub ~ Manure, Y.sub) 
    axis.test <- anova(rda.mod, by = "axis") 

    list(rda.mod, axis.test) 
} 

rda.subsetfunc(RV = dune, Y = dune.env) 
+0

Oh wow, c'est un truc sympa (mais un peu dangereux)! Merci – Nightingale