2010-11-09 4 views
9

J'utilise plusieurs centaines de jeux de données via glm.nb à l'aide d'une fonction wrapper. Rien d'extraordinaire, je viens de passer sur chaque élément de la liste via llply, puis ajuster en utilisant glm.nb, écrire les coefficients à un data.frame et le renvoyer.Comment ignorer les erreurs et poursuivre le traitement des éléments de la liste?

Il n'est pas surprenant que glm.nb ne converge pas pour certains jeux de données. Plutôt que d'avoir la fonction cracher une erreur et arrêter, je préfère qu'il continue à travers le reste des jeux de données et de renvoyer des résultats lorsque cela est possible.

Ma première tentative était la suivante:

res.model <- function(x) 
     { 
     res <- try(invisible(glm.nb(x~y, data=x))) 
    if(!("try-error" %in% class(res))) 
     { 
    return (data.frame(site=unique(x$site_name),species=unique(x$species),coef=res$coefficients[2])) 
     } 
} 

Toute réflexion sur une façon plus générique d'ignorer les erreurs pour que je puisse faire ce travail?

+0

Je ne sais pas grand-chose sur 'plyr', mais est-ce que' failwith() 'comme indiqué dans l'aide intro guide? http://had.co.nz/plyr/plyr-intro-090510.pdf – Chase

+0

Peut-être: http://stackoverflow.com/questions/2963729/r-catching-errors-in-nls – nico

Répondre

9

J'ai un nls() que je cours qui a le même défi. Je postule la régression à chaque groupe dans un data.frame, mais cette logique devrait fonctionner pour vous aussi (je pense):

dlply(myData, c("group1", "group2"), function(df){ 
     tryCatch(nls(depen ~ exp(a1 + b1 * year) , data=df, start = list(a1 = -1, b1 = 0), na.action=na.omit), error=function(e) NULL) 

donc si je devais deviner comment l'appliquer à votre situation, ce serait quelque chose comme:

res <- trycatch(glm.nb(x~y, data=x), error=function(e) NULL) 

la façon dont je l'utilise, je suis lancer NA valeurs chaque fois que la régression ne converge pas. Vous voudrez peut-être faire quelque chose de différent.

5

vous pouvez également utiliser la fonction failwith dans plyr. si f est la fonction que vous passez à plyr, vous pouvez passer à la place la fonction

safef = failwith(NA, f) 

bien sûr, vous pouvez remplacer NA avec tout ce dont vous avez besoin valeur de retour lorsque la fonction échoue. ce code est directement extrait des exemples de failwith.

Questions connexes