通过Python使用loess函数时的rpy2 / R问题?

2 投票
2 回答
1446 浏览
提问于 2025-04-17 19:56

我正在尝试通过 Rpy2 在 Python 中调用 R 的一个函数 loess,数据文件在这里:http://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 的接口有问题?谢谢。

2 个回答

1

为什么要用R语言呢?其实你可以在Python中使用statsmodels这个包来进行低ess平滑处理

另外,还有一个叫Bio.Statistics的包也可以做低ess平滑,但它的准确性似乎不如statsmodels,而且我在这个低ess示例中也没能让它正常工作。

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

撰写回答