8

我正在做一个项目,我有很多分析师在 R 中创建统计模型。他们通常为我提供模型对象(.Rdata 文件),我会自动为各种数据集执行它们。

我的问题是:

  • 我可以使用数据库并将这些 .RData 文件保存在那里吗?关于这样做的任何提示?(我目前将 .Rdata 文件存储到磁盘并使用数据库存储位置信息)

  • 我从其他分析师那里得到了很多 R 脚本,他们在创建模型之前已经对数据进行了一些预处理。有没有人有使用 PMML 使这个过程在没有人工干预的情况下可重复的经验?PMML 将预处理步骤、建模步骤存储为标记标签,并将在新数据集上重复相同的操作。

感谢您的建议和反馈。

-残酷的

4

4 回答 4

6

是的,这可以使用例如 MySQL 通过RMySQLandDBI包或通过RODBCorRJDBC包链接到 R。我不是 100% 确定它们是否都支持 blob,但在最坏的情况下,您可以使用 ascii 表示并将它们放在文本字段中。

诀窍是使用该功能serialize()

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

现在您可以在数据库中存储或检索 obj。它实际上只不过是一个 ascii(或二进制)代码的向量。ascii=F 给你一个二进制表示。检索它后,您使用:

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

Coefficients:
(Intercept)            x  
      4.033        4.992  

编辑:关于 pmml,pmmlCRAN 上有一个包。也许那个人会把你带到某个地方?

于 2010-10-17T22:21:34.323 回答
2

R 可以序列化和反序列化任何对象,这就是我的摘要包通过在序列化对象上运行散列函数来创建所谓的“散列摘要”的方式。

因此,一旦您拥有序列化对象(可以序列化为character),请将其存储起来。任何关系数据库都将支持这一点,NoSQL 键/值存储也将支持这一点——对于任一后端,您甚至可以使用“哈希摘要”作为键或其他一些元信息。

其他替代品例如RProtoBuf也可以非常有效地序列化和反序列化(但您必须先编写 .proto 文件)。

于 2010-10-17T22:34:32.807 回答
2

请注意,一个 .RData 文件可以包含许多 R 对象,因此您需要决定如何处理它。如果您附加 .RData 文件,您可以使用带有 pos 参数的 ls() 获取其中的对象:

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

然后您可以遍历它们,从位置按名称获取()它们,并将它们序列化为列表(p是我的列表索引)

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

现在您必须将 s 的元素喷射到您的数据库中,可能是在名称(某种字符)和值(序列化数据,我猜是 BLOB 或 varchar)的表中。

于 2010-10-18T09:21:44.680 回答
1

正如其他人所提到的,是的,您可以将模型的输出作为文本存储在数据库中。不过,我不相信这对您很有用。

如果您希望能够在以后重新创建这些模型,那么您需要存储创建模型的输入数据集和代码,而不是输出。

当然,您也可以存储模型输出,在这种情况下,您需要考虑其在数据库中的格式。如果您希望能够找到特定的模型结果并对其进行过滤或排序,那么如果您将它们添加到具有某种结构(和一些元数据)的数据库中会容易得多。

例如,您可能想要检索存在显着性别反应的所有模型。在这种情况下,您需要将该信息作为单独的字段添加到数据库中,而不必搜索 ascii 块。添加其他信息(例如模型创建者和创建日期)也将对您以后有所帮助。

于 2010-10-18T15:36:42.477 回答