2015-08-07 6 views
0

Я застрял на графике, наблюдая за прогнозируемыми значениями, используя 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 как плавающий вектор. Но я не понимаю, почему он не работает, и должен быть лучший способ. Любые идеи и помощь в моей проблеме очень ценятся.

ответ

0

Если какие-либо сомнения о том, что 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

+0

Изменение .rx к .rx2 в мой питон код работал! –