如何在Rpy python中应用库VCD的R函数Assocstats

时间:2014-04-30 08:15:09

标签: python r rpy2

我正在尝试使用python的Rpy模块计算统计参数phi系数,Cramer's V和Contigency Coefficient。在R我能够这样做,但我在我的智慧结束我试图在python中复制相同的

Library(vcd)
data <- read.csv("test.csv")
assocstats(table(data$var_4, data$target)

Output     
                X^2 df P(> X^2)
Likelihood Ratio 113.28  1        0
Pearson          112.51  1        0

Phi-Coefficient   : 0.15 
Contingency Coeff.: 0.148 
Cramer's V        : 0.15 

在python中实现

from Rpy import r
# Already connected with mysql
q="Select var_4 , target from test"
cur.execute(q)
data=cur.fetchall()
ls1=[]
ls2=[]
for i in range(len(data)):
  ls1.append(data[i][0])
  ls2.append(data[i][1])
rpy.r.library("vcd")
rpy.r.assocstats(rpy.r.table(ls1,ls2))

错误:

Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
rpy.r.assocstats(rpy.r.table(ls1,ls2))
RPy_RException: Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

我尝试的另一种方法是从scipy模块计算phi sq,然后使用数学公式来计算cramer&s; sv等。但我打算在我的项目中大量使用Rpy。我真的很感激我可以用上述方法指出问题所在。我想我无法在公式中以适当的格式传递输入 在此先感谢

2 个答案:

答案 0 :(得分:0)

从错误中我们可以看到sort函数存在list输入问题。测试此案例以获取样本列表

templist<-list(c(3,2,1))
> sort(templist)
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic

newlist<-unlist(templist)
>is.atomic(newlist)
[1] TRUE

> sort(newlist)
[1] 1 2 3

此处的密钥为unlist,您可以使用ls1确认您的输入ls2listrpy.r.is.list。要取消列出,rpy.r.unlistls1都需要调用ls2

为了能够在.等函数名称中使用is.list()的函数,您可以参考(Accessing functions with a dot in theior name (eg. "as.vector") using rpy2

我没有rpy因此无法确认,但我认为这应该有效,请告诉我们。

答案 1 :(得分:0)

您是否真正使用了标签中所述的rpy2?看起来对我rpy。无论如何,如果您还没有这样做,我强烈建议您迁移到rpy2

您的ls1 ls2看起来只是数字列表,问题应该非常简单:

In [60]:
#setting up
import rpy2.robjects as ro
mydata = ro.r['data.frame']
table = ro.r['table']
assocstats = ro.r['assocstats']
summary = ro.r['summary']
ro.r['library']('vcd')
ls1=np.random.random(50)
ls2=np.random.random(50)
result=assocstats(table(ls1, ls2))

In [61]:
#what is in the result
print result.names
[1] "table"       "chisq_tests" "phi"         "contingency" "cramer"     

In [62]:
#access the chi-sqaure table
print result.rx('chisq_tests')
$chisq_tests
                       X^2   df  P(> X^2)
Likelihood Ratio  391.2023 2401 1.0000000
Pearson          2450.0000 2401 0.2382456