簡體   English   中英

Python 中的穩健 2-Way ANOVA

[英]Robust 2-Way ANOVA in Python

我需要從 Python 運行穩健的方差分析。 我要使用的t2way是來自 R package 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 環境。 任何幫助將非常感激。

這是我對這個問題的特殊解決方案。 一開始,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.ZE1E1D3D40573127E9EE0480C1 的.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 公式 object。 一些 R 函數將接受字符串並假定它們是公式,但這取決於 package 作者,並非總是如此。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM