2010-10-17 3 views
8

Je travaille sur un projet où de nombreux analystes créent des modèles statistiques en R. Ils me fournissent généralement les objets modèles (fichiers .Rdata) et les automatisent en les exécutant pour différents jeux de données.Sérialiser le fichier .RData à la base de données

Mon problème est:

  • Puis-je utiliser une base de données et enregistrer ces fichiers .rdata là? Des conseils sur ce faire? (Je stocke actuellement les fichiers .Rdata sur le disque et utilise une base de données pour stocker les informations de localisation)

  • Je reçois beaucoup de scripts R d'autres analystes qui ont effectué un pré-traitement des données avant de créer les modèles. Est-ce que quelqu'un a déjà utilisé le langage PMML pour rendre ce processus répétable sans intervention manuelle? PMML stocke les étapes de pré-traitement, les étapes de modélisation en tant que balises de marquage et répète la même chose sur un nouvel ensemble de données.

Nous vous remercions de vos suggestions et commentaires.

-Harsh

Répondre

6

Oui, cela est possible en utilisant MySQL, par exemple lié à R avec le paquet RMySQL et DBI, ou par l'intermédiaire du paquet RODBC ou RJDBC. Je ne suis pas sûr à 100% qu'ils prennent tous en charge les blobs, mais dans le pire des cas, vous pourriez utiliser la représentation ASCII et les mettre dans un champ de texte.

L'astuce utilise la fonction serialize()

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

Maintenant vous pouvez stocker ou récupérer obj dans une base de données. Ce n'est en fait qu'un vecteur de codes ascii (ou binaires). ascii = F vous donne une représentation binaire. Après avoir récupéré, vous utilisez:

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

Coefficients: 
(Intercept)   x 
     4.033  4.992 

Edit: en ce qui concerne la PMML, il y a un paquet pmml sur CRAN. Peut-être que celui-ci vous amène quelque part?

+0

Même si les blobs ne sont pas supportés, vous pouvez sérialiser/désérialiser vers et à partir d'ascii (comme vous le faites même dans votre exemple), puis stocker la chaîne ascii. –

+0

Je pensais l'avoir dit? est-ce que je l'ai mal dit? –

+1

Notez que l'ascii sérialisé obj est 16k octets grand (longueur (obj)), la version binaire est 11k octets grand, mais si vous enregistrez ("tt", fichier = "tt.RData") vous obtenez quelque chose de seulement 5k gros. – Spacedman

2

R peut sérialisation et la désérialisation tout objet, qui est la façon dont mon paquet digest crée soi-disant « digests de hachage » en exécutant une fonction de hachage sur l'objet sérialisé.

Ainsi, une fois que vous avez l'objet sérialisé (qui peut être sérialisé à character), stockez-le. Toute base de données relationnelle le supportera, de même que les clés/valeurs NoSQL - et que ce soit pour le backend, vous pourriez même utiliser le 'hash digest' comme clé, ou d'autres méta-informations.

D'autres alternatives sont par exemple RProtoBuf qui peut aussi sérialiser et désérialiser très efficacement (mais vous devez d'abord écrire les fichiers .proto).

+0

L'idée NoSQL semble séduisante. Le nouveau paquet de Cabinet de Tokyo dans R pourrait aider ici. – harshsinghal

2

Notez qu'un fichier .RData peut contenir plusieurs objets R, vous devez donc décider comment gérer cela. Si vous attachez le.RDATA fichier que vous pouvez obtenir les objets avec ls() avec un argument pos:

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

alors vous pouvez passer en boucle les, faites-les() par le nom de la position, et sérialisation à une liste (p est mon index de liste)

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

maintenant, vous aurez à faire gicler les éléments de s à votre DB, probablement dans une table de nom (une sorte de char) et la valeur (les données sérialisés, un blob ou varchar J'imagine).

1

Comme d'autres l'ont mentionné, oui vous pouvez stocker les sorties des modèles en tant que texte dans votre base de données. Je ne suis pas convaincu que cela vous sera très utile.

Si vous souhaitez pouvoir recréer ces modèles à une date ultérieure, vous devez stocker l'ensemble de données en entrée et le code qui ont créé les modèles, plutôt que la sortie.

Bien sûr, vous pouvez également stocker la sortie du modèle, auquel cas vous devez penser à son format dans la base de données. Si vous voulez pouvoir trouver des résultats de modèles particuliers et les filtrer ou les ordonner, il sera beaucoup plus facile de les ajouter à la base de données avec une certaine structure (et quelques métadonnées). Par exemple, vous voudrez peut-être récupérer tous les modèles dans lesquels il y a eu une réponse significative au genre. Dans ce cas, vous devez ajouter cette information en tant que champ séparé dans la base de données plutôt que d'avoir à faire une recherche parmi les morceaux d'ascii. L'ajout d'autres informations telles que le créateur du modèle et la date de création vous sera également utile plus tard.

+0

Vous semblez avoir abordé tous les aspects de mon problème. J'essaie de créer un moyen de "baliser" les variables indépendantes dans un objet modèle glm, et si certaines variables sont dérivées des colonnes de données source (et leurs transformations). Actuellement, j'enregistre le modèle et le script R qui ont été utilisés pour le créer, mais je souhaite créer une structure plus générique pour retracer le chemin des données vers l'objet du modèle. – harshsinghal

Questions connexes