2016-05-25 6 views
0

ich den Zugriff auf Funktionen versuche in Python in 'midasr' r Paket, hier ist mein Code:Fehler beim midasr r Paket Funktion durch rpy2 in Python mit

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
import rpy2.robjects as robjects 
from rpy2.robjects.packages import importr 
import pandas as pd 

.... 
base = importr('base') 
stats = importr('stats') 
midasr = importr('midasr') 

x = np.random.rand(11256) 
y = np.random.rand(1407) 
eq = midasr.midas_r('y ~ mls(x, 0:15, 8, nealmon)', start = 'list(x = c(0, 0))') 

ich den Fehler:

RRuntimeError: Error in new.env(parent = environment(formula)) : 
    use of NULL environment is defunct 

Es in R arbeitet wie:

eq_r <- midas_r(y ~ mls(x, 0:15, 8, nealmon), start = list(x = c(0,0))) 

Also versuchte ich eine andere Methode:

temp = np.empty(len(x)) 
temp[:] = np.nan 
temp[0:1407] = y 
dataframe = pd.DataFrame({'x': x, 'y': temp}) 
rdf = pandas2ri.DataFrame(dataframe) 
robjects.globalenv['dataframe'] = dataframe 
eq = midasr.midas_r('y[1:1407] ~ mls(x, 0:15, 8, nealmon)', data=rdf, start = 'list(x = c(0, 0))') 

Immer noch der gleiche Fehler.

Nachdem ich die Antwort von @Parfeit bekommen, habe ich versucht:

formula = robjects.Formula('y_ro ~ mls(x_ro, 0:15, 8, nealmon)') 
env = formula.environment 
env["y_ro"] = y_ro 
env["x_ro"] = x_ro 
slist = robjects.ListVector({'x_ro': robjects.IntVector((0, 0))}) 
eq = midasr.midas_r(formula, start = slist) 

Aber jetzt erhalte ich:

RRuntimeError: Error in midas_r.fit(prepmd) : 
    The optimisation algorithm of MIDAS regression failed with the following message: 
Error in y - mdsrhs(p) : non-conformable arrays 

Please try other starting values or a different optimisation function 

Allerdings kann ich erfolgreich die gleichen Datensätze in r laufen.

Wer weiß, wie man das beheben kann? Danke vielmals!

Antwort

1

Betrachten Sie Ihre Formel Gebäude, vorbei in aktuellen Werten und start Argument mit einem in Python-Objekt übergeben:

x = np.random.rand(11256) 
y = np.random.rand(1407) 

formula = robjects.Formula('y ~ x') 
env = formula.environment 
env["y"] = y 
env["x"] = midasr.mls(x, robjects.IntVector(range(15)), 8, midasr.nealmon) # MLS() FCT 

slist = robjects.ListVector({'x': robjects.IntVector((0, 0))})    # R LIST: $x [1] 0 0 

eq = midasr.midas_r(formula, start = slist) 
+0

Dank für die Antwort! 'env [" x "] = midasr.mls (x, range (15), 8, nealmon)' sollte 'env [" x "] = midasr.mls (x, np.array (range (16)) sein, 8, 'nealmon') '. Aber nachdem ich das ausgeführt habe, bekam ich 'Fehler in as.vector (x $ model [, -1]% *% x $ midas_coefficifolds): Fehler bei der Bewertung des Arguments 'x' bei der Auswahl einer Methode für die Funktion 'as.vector ': Fehler in x $ model [, -1]% *% x $ midas_koeffizienten: nicht konforme Argumente' – user5025141

+0

Woher kommt 'nealmon'? Wenn es ein benanntes Objekt ist, muss es in Python definiert werden. Und Rs "0: 15" übersetzt sich als Pythons 'range (15)', nicht 'np.array()'. Und eigentlich sollte es "robjects.IntVector (range (15))" pro [docs] (http://rpy.sourceforge.net/rpy2/doc-2.2/html/vector.html) sein. – Parfait

+0

'nealmon' ist eine Gewichtsfunktion im Midasr-Paket. 'np.array()' und 'robjects.IntVector (range (15))' funktionieren auf die gleiche Weise, beide erzeugen korrekt. – user5025141