2013-03-21 70 views
2

我試圖通過Rpy2 Python中調用R函數loess這個數據文件:http://filebin.ca/azuz9Piv0z8/test.data通過Python在黃土功能rpy2/R問題?

它的工作原理,當我使用的數據(第1000點),但一個子集,當我嘗試使用整個文件,我收到一個錯誤。我的代碼:

import pandas 
from rpy2.robjects import r 
import rpy2.robjects as robjects 
data = pandas.read_table(os.path.expanduser("~/test2.data"), sep="\t").values 
small_data = data[0:1000, :] 
print "small data loess:" 
a, b = robjects.FloatVector(list(small_data[:, 0])), \ 
     robjects.FloatVector(list(small_data[:, 1])) 
df = robjects.DataFrame({"a": a, "b": b}) 
loess_fit = r.loess("b ~ a", data=df) 
print loess_fit 

print "large data loess:" 
a, b = robjects.FloatVector(list(data[:, 0])), \ 
     robjects.FloatVector(list(data[:, 1])) 
df = robjects.DataFrame({"a": a, "b": b}) 
loess_fit = r.loess("b ~ a", data=df) 
print loess_fit 

配件上small_data作品,但不data。我收到錯誤:

Error in simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize, : 
    NA/NaN/Inf in foreign function call (arg 1) 
    loess_fit = r.loess("b ~ a", data=df) 
    File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.3-py2.7-linux-x86_64.egg/rpy2/robjects/functions.py", line 86, in __call__ 
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.3-py2.7-linux-x86_64.egg/rpy2/robjects/functions.py", line 35, in __call__ 
    res = super(Function, self).__call__(*new_args, **new_kwargs) 
rpy2.rinterface.RRuntimeError: Error in simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize, : 
    NA/NaN/Inf in foreign function call (arg 1) 

這怎麼解決?我不確定這是R函數loess還是與Rpy2接口有關的問題?謝謝。

回答

3

的問題是在你的數據-Inf值:

DF <- read.table('http://filebin.ca/azuz9Piv0z8/test.data') 
DF[!is.finite(DF[,1]) | !is.finite(DF[,2]),] 
#  V1 V2 
# 5952 -Inf -Inf 
+0

謝謝!只是注意到它 - 奇怪,因爲我在'pandas'之前做了'dropna()'。有沒有辦法使「黃土」適合NA值,或者我應該預先將它們移除 – user248237dfsf 2013-03-21 21:00:15

+0

「Inf」與「NA」不同。 「黃土」對後者處理得很好(參見它的'na.action'參數)。你可以使用DF [!is.finite(DF [,1])|) !is.finite(DF [,2]),] < - NA'。 – Roland 2013-03-21 21:03:07

+1

'inf'和'-inf'不被認爲是熊貓的缺失值,參見:http://pandas.pydata.org/pandas-docs/stable/missing_data.html,所以'dropna()'不會有任何影響。 – herrfz 2013-03-21 21:04:25

1

爲什麼叫R,當你可以使用statsmodels package in Python for lowess smoothing

lowess還有一個Bio.Statistics軟件包,但它看起來並沒有那麼準確,我無法得到它的收斂性爲this lowess example

+0

值得注意的是,OP使用的是LOESS,而不是LOWESS。它們不是同一件事。 LOESS遲些來了,是一個更靈活的概括。 (你可以認爲LOESS是一個多變量的LOWESS,但這是一個過分簡單化。)statsmodels有LOWESS,但不是LOESS。 (所有這一切,所提供的例子看起來使用一個單變量模型,可以與LOWESS等效完成。) – Owen 2015-01-15 22:49:40