2010-10-17 17 views
8

Sto lavorando a un progetto in cui ho un sacco di analisti che creano modelli statistici in R. Di solito mi forniscono gli oggetti del modello (file .data) e li automatizzo eseguendoli per vari set di dati.Serializzazione .RData file nel database

Il mio problema è:

  • Posso usare un database e salvare questi file .rdata lì? Qualche suggerimento per farlo? (Attualmente memorizzo i file .Rdata su disco e utilizzo un database per memorizzare le informazioni sulla posizione)

  • Ricevo molti script R da altri analisti che hanno eseguito alcuni pre-elaborazione dei dati prima di creare i modelli. Qualcuno ha esperienza nell'utilizzo di PMML per rendere ripetibile questo processo senza l'intervento manuale? PMML memorizza i passaggi di pre-elaborazione, i passaggi di modellazione come tag di markup e ripeterà lo stesso su un nuovo set di dati.

Grazie per i suggerimenti e le risposte.

-Harsh

risposta

6

Sì, questo è possibile utilizzare ad esempio MySQL legato a R con il pacchetto RMySQL e DBI, oppure tramite il pacchetto RODBC o RJDBC. Non sono sicuro al 100% se supportano tutti i BLOB, ma nel peggiore dei casi è possibile utilizzare la rappresentazione ascii e inserirli in un campo di testo.

Il trucco sta usando la funzione serialize()

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

Ora è possibile memorizzare o recuperare obj in un database. In realtà non è più di un vettore di codici ascii (o binari). ascii = F ti fornisce una rappresentazione binaria. Dopo aver recuperato esso, si utilizza:

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

Coefficients: 
(Intercept)   x 
     4.033  4.992 

Edit: per quanto riguarda il PMML, c'è un pacchetto di pmml su CRAN. Forse quello ti porta da qualche parte?

+0

Anche se i BLOB non sono supportati, è possibile serializzare/unserializzare da e verso ascii (come si fa anche nell'esempio) e quindi memorizzare la stringa ascii. –

+0

Pensavo di averlo detto? ho detto qualcosa di sbagliato? –

+1

Si noti che l'obj serializzato ascii è grande 16k byte (lunghezza (obj)), la versione binaria è grande 11k, ma se si salva ("tt", file = "tt.RData") si ottiene qualcosa solo 5k grandi. – Spacedman

2

R può serializzare e deserializzare qualsiasi oggetto, è così che il mio pacchetto digest crea cosiddetti 'digest hash' eseguendo una funzione di hash sopra l'oggetto serializzato.

Quindi, una volta ottenuto l'oggetto serializzato (che può essere serializzato su character), memorizzarlo. Tutto il database relazionale supporterà questo, così come la chiave NoSQL/archivi di valore - e per entrambi i backend potresti anche usare il 'hash digest' come chiave, o qualche altra meta-informazione.

Altre alternative sono ad esempio RProtoBuf che possono anche serializzare e de-serializzare in modo molto efficiente (ma prima dovresti scrivere i file .proto).

+0

L'idea NoSQL sembra allettante. Il nuovo pacchetto di Tokyo Cabinet in R potrebbe aiutare qui. – harshsinghal

2

Si noti che un file .RData può contenere molti oggetti R, quindi è necessario decidere come affrontarlo. Se si allega il.RDATA file che si possono ottenere gli oggetti in essa con ls() con un argomento pos:

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

allora si può ciclo su di loro, get() per nome dalla posizione, e li serializzare a un elenco (p è la mia lista di indice)

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

Ora dovrete a schizzare gli elementi di s al vostro DB, probabilmente in una tabella di nome (qualche tipo di caratteri) e valore (i dati serializzati, un BLOB o varchar Suppongo).

1

Come altri hanno già detto, sì è possibile memorizzare le uscite dai modelli come testo nel database. Non sono convinto che questo ti sarà molto utile.

Se si desidera essere in grado di ricreare tali modelli in un secondo momento, è necessario memorizzare il set di dati di input e il codice che ha creato i modelli, piuttosto che l'output.

Naturalmente, è possibile memorizzare anche l'output del modello, nel qual caso è necessario pensare al suo formato nel database. Se vuoi essere in grado di trovare particolari risultati del modello e filtrarli o ordinarli, allora sarà molto più facile se li aggiungi al database con qualche struttura (e alcuni metadati).

Ad esempio, è possibile recuperare tutti i modelli in cui è presente una significativa risposta di genere. In tal caso è necessario aggiungere tali informazioni come campo separato nel database piuttosto che dover cercare tra i blocchi di ascii. L'aggiunta di altre informazioni come il creatore del modello e la data di creazione ti aiuterà anche in seguito.

+0

Sembra che tu abbia toccato tutti gli aspetti del mio problema. Sto cercando di creare un modo per "contrassegnare" le variabili indipendenti in un oggetto modello glm e se alcune variabili derivano da colonne di dati di origine (e le loro trasformazioni). Attualmente, salvi il modello e lo script R che sono stati creati per crearlo, ma voglio creare una struttura più generica per rintracciare il percorso dai dati all'oggetto del modello. – harshsinghal

Problemi correlati