Tuneando funciones en R (II)

Tuneando funciones en R (II)

Hace unos días habíamos posteado (acá) un "tuneo" de una función de R. Básicamente, tomar una función de otro paquete (survey) que realizaba muestreo estratificado y adaptarla a unos objetivos muy específicos (poder hacer muestreo con reposición y poder definir las proporciones de casos a muestrear en cada estrato)

Acá está la función original:

#### FUNCION PARA BOOSTRAPEO POR ESTRATOS ####
# strata = Vector que identifica los estratos
# counts = Cantidad de casos en cada uno de los estratos
# rep = Argumento lógico: TRUE si el muestreo es con reposición; FALSE si no
# prop = Argumento numérico: indica la proporción de casos que se muestrean al interior del estrato

stratify<-function(strata, counts, rep=FALSE, prop=1){
        strata<-as.character(strata)
        n<-length(strata)
        rval<-integer(sum(counts))
        allrows<-1:n
        j<-0
        for (i in 1:length(counts)){
                c<-counts[i]
                thisstrat<-names(counts)[i]
                rows<-allrows[strata == thisstrat]
                rval[j+(1:round(c*prop,0))]<-sample(rows,round(c*prop,0),replace=rep)
                j<-j+c
        }
        rval
}

Ahora, se nos ocurrió que quizás podría ser útil "integrar" todo en una única función que pudiera realizar muestreo estratificado o muestreo aleatorio simple. La idea era no tener que estar cambiando cada vez la función utilizada sino usar una sola función en la que se puedan cambiar los argumentos.

Acá está la función "integradora":

### FUNCION PARA GENERACION DE TEST Y TRAINING SETS ###
# x = matriz/data.frame de variables independientes,
# sampling = Método de muestreo (por ahora, "stratified" es muestreo estratrificado y "srs", aleatorio simple)
# st = Argumento válido solo si sampling="stratified"; vector que identifica los estratos
# prp = Proporción de casos 

gen_index<-function(x,st,sampling="srs",prp=1,rp=FALSE){
        if (sampling=="stratified"){
                countt<-as.vector(table(st))
                names(countt)<-names(table(st))
                train<-stratify(st,countt,rep=rp,prop=prp)
        }
        else if (sampling=="srs"){
                train<-sample(1:nrow(x),round(nrow(x)*prp,0),replace=rp)
        }
        return(train)
}

Hay que pasar como primer argumento la matriz o data.frame de la que se busca realizar el muestreo. El argumento seteado por defecto es "srs" con lo cual, salvo que se especifique lo contrario, va a hacer muestreo aleatorio simple. gen_index "llama" a la función "stratify" si se le pasa el argumento correspondiente (sampling="stratified"). El resto de los argumentos definen el vector de estratos (st, solamente si se hace muestreo estratificado), la proporción de casos (prp) y si se hace con reposición o no.

La idea sería ir enriqueciendo esta función a medida que vayan surgiendo requerimientos más específicos.

Comentarios

Entradas populares de este blog

Sobre la multicausalidad

Número efectivo de partidos en elecciones presidenciales 1983-2011

El ruido de las capitales (vol. 1)