2010-10-17 9 views
8

Estoy trabajando en un proyecto en el que tengo muchos analistas creando modelos estadísticos en R. Usualmente me proporcionan los objetos modelo (archivos .Rdata) y automatizo su ejecución para varios datasets.Serializando el archivo .RData en la base de datos

Mi problema es:

  • ¿Puedo utilizar una base de datos y guardar estos archivos .rdata allí? ¿Alguna pista sobre hacer esto? (Actualmente almaceno los archivos .Rdata en el disco y uso una base de datos para almacenar información de ubicación)

  • Recibo muchos guiones R de otros analistas que han hecho un preprocesamiento de datos antes de crear los modelos. ¿Alguien tiene experiencia en el uso de PMML para hacer este proceso repetible sin intervención manual? PMML almacena los pasos de preproceso, modelando pasos como etiquetas de marcado, y repetiría lo mismo en un nuevo conjunto de datos.

Gracias por las sugerencias y comentarios.

-Harsh

Respuesta

6

Sí, esto es posible usando, por ejemplo MySQL ligado a R con el paquete de RMySQL y DBI, o mediante el paquete RODBC o RJDBC. No estoy 100% seguro de que todos admitan blobs, pero en el peor de los casos, podría usar la representación ascii y ponerlos en un campo de texto.

El truco está utilizando la función serialize()

> x <- rnorm(100) 
> y <- 5*x+4+rnorm(100,0,0.3) 
> tt <- lm(y~x) 
> obj <- serialize(tt,NULL,ascii=T) 

Ahora se puede almacenar o recuperar obj en una base de datos. En realidad no es más que un vector de códigos ascii (o binarios). ascii = F te da una representación binaria. Después de recuperarla, se utiliza:

> unserialize(obj) 
Call: 
lm(formula = y ~ x) 

Coefficients: 
(Intercept)   x 
     4.033  4.992 

Editar: en cuanto a la PMML, hay un paquete pmml en CRAN. Tal vez ese te lleva a alguna parte?

+0

Incluso si blobs no son compatibles, puede serializar/deserializar hacia y desde ascii (como lo hace incluso en su ejemplo) y luego almacenar la cadena de caracteres. –

+0

¿Pensé que lo dije? ¿Lo dije mal? –

+1

Tenga en cuenta que el obj serializado ascii tiene 16k bytes de longitud (obj), la versión binaria tiene 11k bytes, pero si guarda ("tt", file = "tt.RData") obtendrá algo solo 5k grande. – Spacedman

2

R puede serializar y deserializar cualquier objeto, que es como mi paquete digest crea los llamados '' compendios de hash mediante la ejecución de una función hash sobre el objeto serializado.

Una vez que tenga el objeto serializado (que se puede serializar en character), guárdelo. Cualquier base de datos relacional soportará esto, al igual que la clave/valor NoSQL almacena, y para cualquier backend incluso podría usar el 'resumen de hash' como una clave, o alguna otra metainformación.

Otras alternativas son, por ejemplo, RProtoBuf que también se pueden serializar y deserializar de manera muy eficiente (pero primero tendría que escribir los archivos .proto).

+0

La idea de NoSQL parece atractiva. El nuevo paquete del gabinete de Tokio en R podría ayudar aquí. – harshsinghal

2

Tenga en cuenta que un archivo .RData puede contener muchos objetos R, por lo que debe decidir cómo manejarlo. Si adjuntas el.Rdata archivo que puede conseguir los objetos en ella con ls() con un argumento pos:

> attach("three.RData") 
> ls(pos=2) 
[1] "x" "y" "z" 

entonces se puede iterar sobre ellos, get() por su nombre de la posición, y serializarlos a una lista (p es mi índice de lista)

> s=list() 
> p=1 
> for(obn in obnames){ 
+ s[[p]] = serialize(get(obn,pos=2),NULL,ascii=TRUE) 
+ p=p+1 
+ } 

Ahora usted tendrá que rociar los elementos de s de su base de datos, probablemente en una tabla de nombre (una especie de carbón de leña) y valor (los datos serializados, un BLOB o varchar Supongo).

1

Como han mencionado otros, sí puede almacenar las salidas de los modelos como texto en su base de datos. No estoy convencido de que eso te sea útil.

Si desea poder volver a crear esos modelos en una fecha posterior, debe almacenar el dataset de entrada y el código que creó los modelos, en lugar de la salida.

Por supuesto, también puede almacenar la salida del modelo, en cuyo caso debe pensar en su formato en la base de datos. Si desea poder encontrar resultados de modelos particulares y filtrarlos u ordenarlos, será mucho más fácil si los agrega a la base de datos con alguna estructura (y algunos metadatos).

Por ejemplo, es posible que desee recuperar todos los modelos que tuvieron una respuesta de género significativa. En ese caso, debe agregar esa información como un campo separado en la base de datos en lugar de tener que buscar entre los fragmentos de ascii. Agregar más información como el creador del modelo y la fecha de creación también lo ayudará más adelante.

+0

Pareces haber tocado todos los aspectos de mi problema. Estoy tratando de crear una forma de "marcar" las variables independientes en un objeto modelo glm, y si algunas variables derivan de las columnas de datos fuente (y sus transformaciones). Actualmente, guardo el modelo y el guión R que entró en su creación, pero quiero crear una estructura más genérica para volver a rastrear la ruta de los datos al objeto modelo. – harshsinghal

Cuestiones relacionadas