Я застрял на графике, наблюдая за прогнозируемыми значениями, используя rpy2. Код R ниже работы:Вычисление прогнозируемых значений из модели с использованием python и rpy2
#==============================#
# 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: Error in order(as.numeric(x)) : (list) object cannot be coerced to type 'double'
res = super(Function, self).call(*new_args, **new_kwargs) Traceback (most recent call last): File "./testRPY2.py", line 45, in p = lattice.xyplot(formula) File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 178, in call return super(SignatureTranslatedFunction, self).call(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 106, in call res = super(Function, self).call(*new_args, **new_kwargs) rpy2.rinterface.RRuntimeError: Error in order(as.numeric(x)) :
(list) object cannot be coerced to type 'double'
Проблема, безусловно, с предсказанными значениями, потому что изменение формулы для построения у против у порождает хороший сюжет:
formula = Formula('y ~ y')
Я сделал много попыток принудить данные в питоне в трансформируемый формате, в том числе преобразования в строку в Python, манипулировать и отправлять обратно в rpy2 как плавающий вектор. Но я не понимаю, почему он не работает, и должен быть лучший способ. Любые идеи и помощь в моей проблеме очень ценятся.
Изменение .rx к .rx2 в мой питон код работал! –