【问题标题】:Plotting predicted values from a fitted model using python and rpy2使用 python 和 rpy2 从拟合模型中绘制预测值
【发布时间】:2015-10-30 18:13:30
【问题描述】:

我无法使用 rpy2 绘制观察值与预测值。下面的 R 代码有效:

                                                 #==============================#
                                                 # Set up the data.             #
                                                 #==============================#
yTmp <- seq(1,20)
y <- NULL
x1Tmp <- seq(1,20)
x1 <- NULL
x2Tmp <- seq(1,20)
x2 <- NULL
for (i in 1:20)
{
    y[i] = yTmp[i] + runif(1, 0, 1)
    x1[i] = x1Tmp[i] + runif(1, 0, 1)
    x2[i] = x2Tmp[i] + runif(1, 0, 1)
}
                                                #==============================#
                                                # Fit the model.               #
                                                #==============================#
fittedModel <- lm(y ~ x1 + x2)
                                                #==============================#
                                                # Plot the observed vs predicted
                                                #==============================#
png(filename="fittedModel_R.png")
plot(fittedModel$fitted.values, y)
dev.off()

这会产生一个很好的观察与预测图(我会发布,但我需要至少 10 名声望才能发布图片)。

我曾尝试使用 rpy2 重现这一点,但我无法弄清楚如何让拟合值发挥得很好。下面的代码与上面的 R 代码一样,我可以做到,但不起作用:

#!/usr/bin/env python
                                                #==============================#
                                                # Set up packages.             #
                                                #==============================#
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
import random
import string
stats = importr('stats')
from rpy2.robjects import Formula
lattice = importr('lattice')
rprint = robjects.globalenv.get("print")
grdevices = importr('grDevices')
                                                #==============================#
                                                # Set up the data.             #
                                                #==============================#
y = robjects.FloatVector(())
x1 = robjects.FloatVector(())
x2 = robjects.FloatVector(())
for i in range(1,20):
    yValue = i + random.random()
    y.rx[i] = yValue
    x1Value = i + random.random()
    x1.rx[i] = x1Value
    x2Value = i + random.random()
    x2.rx[i] = x2Value
robjects.globalenv["y"] = y
robjects.globalenv["x1"] = x1
robjects.globalenv["x2"] = x2
                                                #==============================#
                                                # Fit the model.               #
                                                #==============================#
fittedModel = stats.lm("y ~ x1 + x2")
                                                #==============================#
                                                # Attempt to extract the fitted 
                                                # values from the model and put
                                                # on a vector.                 #
                                                #==============================#
robjects.globalenv['predicted'] = robjects.Vector(fittedModel.rx('fitted.values'))
                                                #==============================#
                                                # Plot the observed vs predicted
                                                #==============================#
grdevices.png(file = "fittedModel_RPY2.png", width = 512, height = 512)
formula = Formula('y ~ predicted')
p = lattice.xyplot(formula)
rprint(p)
grdevices.dev_off()

这会产生错误:

/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py:106: UserWarning:顺序错误(as.numeric(x)):(列表)对象不能 被强制输入'double'

res = super(Function, self).call(*new_args, **new_kwargs) Traceback(最近一次调用最后一次):文件“./testRPY2.py”,第 45 行,在 p = lattice.xyplot(公式)文件“/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py”, 第 178 行,在 调用 return super(SignatureTranslatedFunction, self).call(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", 第 106 行,在 调用 res = super(Function, self).call(*new_args, **new_kwargs) rpy2.rinterface.RRuntimeError: Error in order(as.numeric(x)) :
(list) 对象不能被强制输入'double'

问题肯定出在预测值上,因为将公式更改为绘制 y 与 y 会生成一个不错的图:

formula = Formula('y ~ y')

我做了很多尝试将 python 中的数据强制转换为可绘图格式,包括在 python 中转换为字符串、操作以及作为浮动向量发送回 rpy2。但我真的不明白为什么它不起作用,必须有更好的方法。非常感谢任何对我的问题的见解和帮助。

【问题讨论】:

    标签: rpy2


    【解决方案1】:

    如果对predicted是什么有疑问,可以试试

    print(type(robjects.globalenv['predicted']))
    

    或更长的输出:

    print(robjects.globalenv['predicted'])
    

    您会发现 R 中没有所谓的原子向量,这几乎可以肯定来自创建 predicted 的那一行:

    robjects.globalenv['predicted'] = robjects.Vector(fittedModel.rx('fitted.values'))
    

    方法.rx()对应R的[,而.rx2()对应R的[[。你会想要后者。

    文档中的介绍有一个带有 R 的lm() 的简短示例: http://rpy.sourceforge.net/rpy2/doc-2.6/html/introduction.html#linear-models

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2021-04-01
      • 2019-09-22
      相关资源
      最近更新 更多