【问题标题】:Robust 2-Way ANOVA in PythonPython中强大的2-Way ANOVA
【发布时间】:2021-06-28 05:38:42
【问题描述】:

我需要从 Python 运行稳健的 ANOVA。我要使用的函数是来自 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 环境。任何帮助将不胜感激。

【问题讨论】:

    标签: python r statistics rpy2


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      这是我针对这个问题的特殊解决方案。一开始,R 中的第一个问题是,当您导入数据框时,您必须更改列酒精和性别 as.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)
      

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

      【讨论】:

        猜你喜欢
        • 2018-11-19
        • 2017-07-18
        • 1970-01-01
        • 2021-07-04
        • 2012-09-22
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多