[R-es] Función assign y paste0 en un loop

rubenfcasal rubenfcasal en gmail.com
Jue Feb 5 18:36:43 CET 2015


Hola Isa,

     Lo que comentas se puede hacer.

     Antes de nada un detalle, tal como lo estas planteando puede ser 
más cómodo que los ajustes los guardes en una lista. Por ejemplo, de la 
forma:
glm.fit <- list()
...
glm.fit[[i]] <- glm(...)
...
Así tienes controlados los objetos en lugar de solo el nombre...

     Para programar cosas de ese estilo (emulando desde el código la 
forma de proceder en la consola ), podemos recurrir a funciones como 
assign() o do.call(). Por ejemplo creo que con do.call podrías hacer 
fácilmente lo que pretendes (e.g. res[[i]] <- do.call("step", 
glm.fit[i]), porque glm.fit[i] es ya una lista...).

     Pero quería aprovechar para comentar que R es un lenguaje 
interpretado. Escribes un texto en la consola que luego es analizado 
(parseado) y evaluado. Para ver un poco como funciona R podríais 
consultar por ejemplo 
http://adv-r.had.co.nz/Computing-on-the-language.html. Lo que esta 
haciendo el interprete de comandos (la consola) se puede hacer con el 
código (e incluso deshacerlo: substitute(), quote()).
     Lo que realmente quería comentar es que con las funciones 
eval(parse(text)) podéis evaluar en R cualquier expresión de texto como 
si se introdujera en la consola. Yo lo tengo empleado alguna vez...

      Espero que sirva de ayuda (y corregidme si veis cualquier cosa...).

     Un saludo, Rubén.

P.D. Si queréis crear una lista de la dimensión correcta glm.fit <- 
vector("list", np) podría ser más adecuado. Realmente no es importante 
en este caso...


El 04/02/2015 a las 11:07, Isa García Barón escribió:
> Hola, espero explicar bien el problema que tengo.
>
> Estoy intentando hacer loops para glm's. El problema vieneal nombrar cada
> glm de una manera y realizar la seleccion por AIC mediante la función step.
>
> Cuando realizo los glm utilizo las funcion assign y paste0, para nombrar a
> cada uno distinto:
>
> asssign(paste0("glm",i),glm(ap~V1+V2+V3+V4+V5,data=datos,family =
> binomial(link=logit)))
>
> Después, lo que pretendo es realizar la selección por AIC, mediante la
> función step para cada glm credo anteriormente y ahí viene el problema, no
> se cómo decirle que me haga el step para cada glm con cada nombre creado
> anteriormente:
>
> assign(paste0("glmstep",i),step("glm",i)
>
> Error: unexpected symbol in:
> "assign(paste0("glmstep",i),step("glm",i)
> todosres"
>
> Necesito hacer esto para extraer los coeficientes de todos los glm finales
> seleccionados, en esta parte supongo que también tendré el mismo problema...
>
> A continuación el script completo:
>
> nes <- read.csv('C:/Aegmon/nes.csv', sep=';', header=T)
>
> nreps=5
>
> #selecting all rows with presences
> index1=which(nes$ap==1)
> np=length(index1)
>
> #create object to holdall results of predicting the probability
> #of the observation left out
> todosres=matrix(0,nrow=nt,ncol=nreps)
>
> for (i in 1:np){
>    datos=nesting[-index1[i],]
>    datosp=datos[datos$ap==1,]
>    datosa=datos[datos$ap==0,]
>    ndatosa=nrow(datosa)
>
>    for (j in 1:nreps) {
>      datosarand=datosa[sample(ndatosa,size=np,replace=FALSE),]
>      newsamp=rbind(datosp,datosarand)
>      asssign(paste0("glm",i),glm(ap~V1+V2+V3+V4+V5,data = datos,family =
> binomial(link=logit)))
>      save(list=paste0("glm",i),file=paste0("resultsglm/glm",i,".Rdata"))
>      assign(paste0("glmstep",i),step("glm",i)
>      todosres[,j]=predict.glm(object=glmtempstep,newdata=nes,type="response")
>    }
> }
>
> coeffsglm=matrix(0,nrow=nt,ncol=9)
> for (i in 1:nt){
>
> coeffsglm[j,]=as.numeric(eval(parse(text=paste0("glmstep",i,"$coefficients"))))
> }
>
>
> Espero haberme explicado bien, muchas gracias
>
> Un saludo
>
> 	[[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
> .
>



Más información sobre la lista de distribución R-help-es