【问题标题】:rpy2 / R issue in loess function via Python?rpy2 / R问题通过Python的黄土函数?
【发布时间】:2013-03-11 13:37:15
【问题描述】:

我正在尝试通过 Python 中的 Rpy2 在此数据文件上调用 R 函数 loesshttp://filebin.ca/azuz9Piv0z8/test.data

当我使用数据的一个子集(前 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接口是否有问题?谢谢。

【问题讨论】:

    标签: python r statistics pandas rpy2


    【解决方案1】:

    问题在于您的数据中的 -Inf 值:

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

    【讨论】:

    • 谢谢!刚刚注意到它 - 很奇怪,因为我之前在 pandas 中做过 dropna()。有没有办法让loess 可以接受 NA 值,或者我应该预先删除它们
    • InfNA 不同。 loess 可以很好地处理后者(参见它的 na.action 参数)。你可以使用DF[!is.finite(DF[,1]) | !is.finite(DF[,2]),] &lt;- NA
    • inf-inf 在 pandas 中不被视为缺失值,请参阅:pandas.pydata.org/pandas-docs/stable/missing_data.html,因此dropna() 不会有任何影响。
    【解决方案2】:

    既然可以使用statsmodels package in Python for lowess smoothing,为什么还要调用R?

    还有一个用于 lowess 的 Bio.Statistics 包,但它似乎不那么准确,我无法让它收敛到 this lowess example

    【讨论】:

    • 值得注意的是,OP 使用的是 LOESS,而不是 LOWESS。它们不是同一件事。 LOESS 出现较晚,是一种更灵活的概括。 (您可以将 LOESS 视为多元 LOWESS,但这过于简单化了。)statsmodels 有 LOWESS,但没有 LOESS。 (话虽如此,提供的示例看起来使用单变量模型,并且可以使用 LOWESS 等效地完成。)
    • 取决于数据大小 statsmodels 函数可能非常慢。我自己还没有测试过,但普遍的看法似乎是 R 实现要快得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-12-24
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多