Python中稳健的双向方差分析

2024-09-25 08:40:40 发布

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

我需要从Python运行健壮的方差分析。我想使用的函数是R包WRS2中的t2way。我尝试使用r2py,但遇到了一个错误:

>>> import rpy2.robjects.packages as rpackages
>>> from rpy2.robjects import pandas2ri
>>> pandas2ri.activate()
>>> df = pd.read_csv("https://github.com/lawrence009/dsur/raw/master/data/goggles.csv")
>>> rdf = pandas2ri.py2rpy(df)
>>> WRS2 = rpackages.importr('WRS2')
>>> WRS2.t2way("attractiveness ~ gender*alcohol", data = rdf)

RRuntimeError: Error in x[[grp[i]]] : 
  attempt to select less than one element in get1index

我正在寻找一种使用rpy2实现这一点的方法,或者(甚至更好)将WRS2移植到python环境。任何帮助都将不胜感激


Tags: csv函数inimportdfdata错误rdf
2条回答

这是我对这个问题的具体解决办法。从一开始,R中的第一个问题是,当您导入数据帧时,您必须更改列的类型酒精和性别作为.factor

在R中,脚本将是:

library(WRS2)
df <- read.csv2("https://github.com/lawrence009/dsur/raw/master/data/goggles.csv",header = TRUE, sep=',')
df[ , c('attractiveness')] <- as.numeric(df[ , c('attractiveness')])
df[ , c('alcohol')] <- as.factor(df[ , c('alcohol')])
df[ , c('gender')] <- as.factor(df[ , c('gender')])
t2way(attractiveness ~ gender*alcohol, data = df)

虽然在python中,我没有找到更改列的数据类型的方法,但我提供了以下解决方案: 首先,您必须创建一个名为my_t2way.R的.R文件,该文件包含:

my_t2way <- function(df1){
    library(WRS2)
    df <- read.csv2(df1,header = TRUE, sep=',')
    df[ , c('attractiveness')] <- as.numeric(df[ , c('attractiveness')])
    df[ , c('alcohol')] <- as.factor(df[ , c('alcohol')])
    df[ , c('gender')] <- as.factor(df[ , c('gender')])
    f <- t2way(attractiveness ~ gender*alcohol, data = df) 
    df1 = data.frame(factor=c('gender','alcohol','gender:alcohol'),
                     value = c(f$Qa,f$Qb,f$Qab),
                    p.value = c(f$A.p.value,f$B.p.value,f$AB.p.value))
    return(df1)
}

然后可以从python运行以下命令

import pandas as pd
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri# Defining the R script and loading the instance in Python
pandas2ri.activate()

r = robjects.r
r['source']('my_t2way.R')# Loading the function we have defined in R.
my_t2way_r = robjects.globalenv['my_t2way']# Reading and processing data
df1 = "https://github.com/lawrence009/dsur/raw/master/data/goggles.csv"
df_result_r = my_t2way_r(df1)

当然,这个解决方案只适用于这种特殊情况,但我认为它可以很容易地扩展到其他数据帧

如果问题在于dataframe中的列不是因子(如其他答案中所建议的),则将它们转换为因子非常容易:

rdf = pandas2ri.py2rpy(df)

base = importr('base')
import rpy2.robjects as ro

for cn in ('alcohol', 'gender'):
    i = rdf.colnames.index(cn)
    rdf[i] = base.as_factor(rdf[i])
    # We could also do it with
    # rdf[i] = ro.FactorVector(rdf[i])

为了安全起见,建议创建一个R公式对象。一些R函数将接受字符串并假定它们是公式,但这取决于包作者,并非总是如此

WRS2.t2way(ro.Formula('attractiveness ~ gender*alcohol'), data = rdf)

相关问题 更多 >