基于rpy2的pandas数据帧分位数回归模型中的不一致数组

2024-09-28 23:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用rpy2(2.7.6)对engel数据集进行分位数回归:

import statsmodels as sm

from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri

pandas2ri.activate()

quantreg = importr('quantreg')

data = sm.datasets.engel.load_pandas().data

qreg = quantreg.rq('foodexp ~ income', data=data, tau=0.5)

但是,这会产生以下错误:

^{pr2}$

据我所知,在这种情况下,不一致数组意味着有一些丢失的值,或者使用的数组大小不同。我可以确认事实并非如此:

data.count()
Out[26]: 
income     235
foodexp    235
dtype: int64

data.shape
Out[27]: (235, 2)

这个错误还意味着什么?是否有可能将数据帧转换为数据帧在rpy2中工作不正常或者我在这里遗漏了什么?其他人能确认这个错误吗?在

以防万一,这里有一些关于R和Python版本的信息。在

R version 3.2.0 (2015-04-16) -- "Full of Ingredients"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

Python 2.7.11 |Anaconda 2.3.0 (64-bit)| (default, Dec  7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)]
on win32

任何帮助都将不胜感激。在

编辑1:

如果直接从R加载数据集,则不会出现错误:

from rpy2.robjects import r

r.data('engel')
data = r['engel']

qreg = quantreg.rq('foodexp ~ income', data=data, tau=0.5)

所以我认为用pandas2ri进行转换有问题。当我试图将数据帧转换为数据帧手动使用pandas2ri.py2ri。在

编辑2:

有趣的是,如果我使用了不推荐使用的pandas.rpy.common.convert_to_r_dataframe错误就消失了:

import pandas.rpy.common as com

rdata = com.convert_to_r_dataframe(data)

qreg = quantreg.rq('foodexp ~ income', data=rdata, tau=0.5)

pandas2ri中肯定有一个bug,这个bug也得到了here的确认。在


Tags: 数据fromimportpandasdata错误rqrpy2
1条回答
网友
1楼 · 发布于 2024-09-28 23:24:04

正如在rpy2 issue tracker上回答的:

问题的根源似乎是pandas数据帧中的列被转换为数组对象,每个对象只有一列。在

>>> pandas2ri.py2ri_pandasdataframe(data) 
<DataFrame - Python:0x7f8af3c2afc8 / R:0x92958b0>
[Array, Array]
  income: <class 'rpy2.robjects.vectors.Array'>
  <Array - Python:0x7f8af57ef908 / R:0x92e1bf0>
[420.157651, 541.411707, 901.157457, ..., 581.359892, 743.077243, 1057.676711]
  foodexp: <class 'rpy2.robjects.vectors.Array'>
  <Array - Python:0x7f8af3c2ab88 / R:0x92e7600>
[255.839425, 310.958667, 485.680014, ..., 468.000798, 522.601906, 750.320163]

区别很微妙,但这似乎混淆了quantreg包。还有其他的R函数似乎独立于对象是一个有一列的数组还是一个向量。在

将列转换为R向量似乎是解决问题所需的:

^{pr2}$

现在我想收集更多的数据,看看这是否可以在不破坏其他东西的情况下解决问题。为此,我将修复程序转换为从pandas转换器派生的自定义转换器:

^{3}$

使用此新转换器的最简单方法可能是在上下文管理器中:

with localconverter(default_converter + my_converter) as cv:
    qreg = quantreg.rq('foodexp ~ income', data=data, tau=0.5)

相关问题 更多 >