使用熊猫数据框的rpy2回归的最小示例

使用熊猫数据框的rpy2回归的最小示例,r,pandas,rpy2,R,Pandas,Rpy2,使用熊猫数据框进行线性回归的推荐方法(如有)是什么?我能做到,但我的方法似乎很精细。我是否让事情变得不必要的复杂 R代码,用于比较: x <- c(1,2,3,4,5) y <- c(2,1,3,5,4) M <- lm(y~x) summary(M)$coefficients Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 1.1489125 0.522233 0.6376

使用熊猫数据框进行线性回归的推荐方法(如有)是什么?我能做到,但我的方法似乎很精细。我是否让事情变得不必要的复杂

R代码,用于比较:

x <- c(1,2,3,4,5)
y <- c(2,1,3,5,4)
M <- lm(y~x)
summary(M)$coefficients
            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880
顺便说一下,我确实收到了关于导入
pandas.rpy.common
的未来警告。然而,当我尝试使用
pandas2ri.py2ri(dataframe)
将数据帧从pandas转换为R(如前所述)时,我得到了

NotImplementedError:未为“”类型的对象定义转换“py2ri”

R和Python并不完全相同,因为您在Python/rpy2中构建了一个数据帧,而在R中使用了向量(没有数据帧)

否则,带有
rpy2
的转换装运似乎在这里工作:

from rpy2.robjects import pandas2ri
pandas2ri.activate()
robjects.globalenv['dataframe'] = dataframe
M = stats.lm('y~x', data=base.as_symbol('dataframe'))
结果是:

>>> print(base.summary(M).rx2('coefficients'))
            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880

调用
pandas2ri.activate()
后,会自动将Pandas对象转换为R对象。例如,您可以使用

M = R.lm('y~x', data=df)
而不是

robjects.globalenv['dataframe'] = dataframe
M = stats.lm('y~x', data=base.as_symbol('dataframe'))

屈服

            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880
我可以通过概述如何检索系数表中的特定元素(关键是p值)来补充

这给我们留下了一个数据帧,我们可以以正常方式访问它:

In [179]: df['Pr(>|t|)']
Out[179]:
(Intercept)    0.637618
x              0.104088
Name: Pr(>|t|), dtype: float64

In [181]: df.loc['x', 'Pr(>|t|)']
Out[181]: 0.10408803866182779

您使用的是什么版本的
rpy2
?我已更新了我的问题以添加此信息。我在数据帧转换方面遇到了类似的问题,但我必须使用非rpy2函数。事实证明,在调用
pandas2ri.py2ri(数据帧)
Nice之前,必须先执行
pandas2ri.activate()
。非常感谢。我知道我最初的尝试可能过于复杂了。@l Unutbu的回答看起来非常直观,因为不需要在R名称空间中指定DF或用作_符号。这种将DF直接传递给r函数的方法是否像UNUNNTBU的示例语法一样受支持,还是会被弃用?我对文档的仔细阅读并没有得到一个答案。@KGS:我的答案集中在否定数据帧转换不起作用的说法。为此,我尽量保持问题中的代码不变。我认为@unutbu的答案不会很快变得无效:R的
stats::lm
始终接受一个参数
data
,我认为它不会轻易改变。
import pandas as pd
from rpy2 import robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()
R = ro.r

df = pd.DataFrame({'x': [1,2,3,4,5], 
                   'y': [2,1,3,5,4]})

M = R.lm('y~x', data=df)
print(R.summary(M).rx2('coefficients'))
            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880
def r_matrix_to_data_frame(r_matrix):
    """Convert an R matrix into a Pandas DataFrame"""
    import pandas as pd
    from rpy2.robjects import pandas2ri
    array = pandas2ri.ri2py(r_matrix)
    return pd.DataFrame(array,
                        index=r_matrix.names[0],
                        columns=r_matrix.names[1])

# Let's start from unutbu's line retrieving the coefficients:
coeffs = R.summary(M).rx2('coefficients')
df = r_matrix_to_data_frame(coeffs)
In [179]: df['Pr(>|t|)']
Out[179]:
(Intercept)    0.637618
x              0.104088
Name: Pr(>|t|), dtype: float64

In [181]: df.loc['x', 'Pr(>|t|)']
Out[181]: 0.10408803866182779