将numpy数组转换为rpy2矩阵(预测包,xreg参数)

4

我似乎无法让这行代码fit = forecast.Arima(series, order=order, xreg=r_exog_train)正常工作。如果不使用xreg参数,它确实可以工作,所以我相信这是numpy数组转换为rpy2矩阵时出现了问题。

有人发现错误了吗?谢谢!

这是我得到的错误信息(部分为德语):

Fehler in `colnames<-`(`*tmp*`, value = if (ncol(xreg) == 1) nmxreg else paste(n
mxreg,  :
  Länge von 'dimnames' [2] ungleich der Arrayausdehnung
Traceback (most recent call last):
  File "r.py", line 58, in <module>
    res = do_forecast(series, horizon=horizon, exog=(exog_train, exog_test))
  File "r.py", line 39, in do_forecast
    fit = forecast.Arima(series, order=order, xreg=exog_train)
  File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 86, in _
_call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 35, in _
_call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Fehler in `colnames<-`(`*tmp*`, value = if (ncol(
xreg) == 1) nmxreg else paste(nmxreg,  :
  Lõnge von 'dimnames' [2] ungleich der Arrayausdehnung   

以下是代码示例:

# Python wrapper for R forecast stuff
import numpy as np

print 'Start importing R.'
from rpy2 import robjects 
from rpy2.robjects.packages import importr
from rpy2.robjects.numpy2ri import numpy2ri
robjects.conversion.py2ri = numpy2ri

base = importr('base')
forecast = importr('forecast')
stats = importr('stats')
ts = robjects.r['ts']
print 'Finished importing R.'


def nparray2rmatrix(x):
  nr, nc = x.shape
  xvec = robjects.FloatVector(x.transpose().reshape((x.size)))
  xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc)
  return xr

def nparray2rmatrix_alternative(x):
  nr, nc = x.shape
  xvec = robjects.FloatVector(x.reshape((x.size)))
  xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc, byrow=True)
  return xr

def do_forecast(series, frequency=None, horizon=30, summary=False, exog=None):
  if frequency:
    series = ts(series, frequency=frequency)
  else:
    series = ts(series)
  if exog:
    exog_train, exog_test = exog
    r_exog_train = nparray2rmatrix(exog_train)
    r_exog_test = nparray2rmatrix(exog_test)
    order = robjects.IntVector([1, 0, 2]) # c(1,0,2) # TODO find right model
    fit = forecast.Arima(series, order=order, xreg=r_exog_train)
    forecast_result = forecast.forecast(fit, h=horizon, xreg=r_exog_test)
  else:
    # fit = forecast.auto_arima(series)
    #robjects.r.plot(series)
    fit = stats.HoltWinters(series)
    forecast_result = forecast.forecast(fit, h=horizon)
  if summary:
    modsummary = base.summary(fit)
    print modsummary
  forecast_values = np.array(list(forecast_result.rx2('mean')))
  return forecast_values


# Example
series = np.arange(100)
exog_train = np.ones((100,2))
exog_test = np.ones((100,2))
horizon = 100
res = do_forecast(series, horizon=horizon, exog=(exog_train, exog_test))
print res

作为一般性的建议,我会尽可能地限制在Python中混合使用R。只需在R中创建“doforecast”函数,将该函数源代码导入当前工作区,并调用它即可。这样,您就可以将R和Python的接口限制在Python中的几行R代码上。这使得您更不可能遇到rpy特定的问题,并且使得调试R代码更加容易。 - Paul Hiemstra
谢谢Paul,我明白了。不过,我仍然会遇到同样的问题,即如何让xreg矩阵正常工作。 - Tim
真的,但作为避免问题的一般方法,我会尽可能使代码相互独立。 - Paul Hiemstra
我通过明确指定“dimnames”来使其工作,如下所示:xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc, dimnames=dimnames) - Tim
你可以发布这个作为答案,并接受它。这将通知其他人你的问题已经得到解答。 - Paul Hiemstra
1个回答

0

我通过显式声明 "dimnames" 来使其工作,代码如下:xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc, dimnames=dimnames)。 显然,预测包需要这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接