微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 rpy2

如何解决通过 rpy2

我正在尝试在 Python 中拟合具有串行自相关或 AR1 错误的逻辑回归。不幸的是,statsmodels 还没有走到这一步;然而,R-package glmmTMB 有。我很接近(似乎)通过 Python 中的 rpy2解决这个问题,但我被卡住了。

我的 R 技能(以及错误RRuntimeError: Error in na.fail.default(as.ts(x)) : missing values in object)表明需要将 na.action 参数修改函数 glmmTMB(在包 glmmTMB 中),但这是在 R 中没有必要——我的例子适合那里并且很高兴。所以,我怀疑 Python-to-R 链中的其他东西出了问题。

我的钱是在变量 timegroupar 中的 formula 部分所需的因子表征上。有没有人看到我能做什么?我没有正确创建因子变量吗?

from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri 
from rpy2 import robjects as ro
import pandas as pd

# Make some data.  
data = {'Success': [10,20,30,11,14,16,18,29,17,19],'Failure': [12,25,61,8,22,21,10,15,19]}
df = pd.DataFrame(data)

# Allow rpy2 to talk to pandas.  
pandas2ri.activate() 

# Bring in some R stuff.  
base = importr('base')
utils = importr('utils')
stats = importr('stats')
glmmTMB = importr('glmmTMB')

# Modify the dataframe for use with glmmTMB.  
df['time'] = range(1,len(df) + 1)
df['group'] = 1

# Convert df to an R dataframe.  
r_df = pandas2ri.py2ri(df)

# Add in group as a factor to R dataframe r_df.
col_group = ro.vectors.FactorVector(r_df.rx2('group'))
assessor_col_index = df.columns.get_loc('group')   # python 
r_df[assessor_col_index] = col_group

# Add in time as a factor to R dataframe r_df.  
col_time = ro.vectors.FactorVector(r_df.rx2('time'))
assessor_col_index = df.columns.get_loc('time')   # python 
r_df[assessor_col_index] = col_time

# Take a look at stuff.  Looks correct.  
print(r_df)
print(col_group)
print(col_time) 

# This works.  normal outcome.  
m0 = ro.r.glmmTMB(formula=ro.r('Success ~ 1'),data=r_df)
# print(m0[1][0])

# This works.  Logistic outcome.  
m1 = ro.r.glmmTMB(formula=ro.r('cbind(Success,Failure) ~ 1'),family=ro.r('binomial'),data=r_df)
# print(m1[1][0])

# This does not work.  AR1 with factors,per documentation.  
# m2 = ro.r.glmmTMB(formula=ro.r("cbind(Success,Failure) ~ 1 + ar(time + 0 | group)"),data=r_df)
# m2[1][0]


# Added for clarity,2021-03-08:  Other variations using na_action argument.  

# m3  = ro.r.glmmTMB(formula=ro.r("cbind(Success,data=r_df,na_action=na_omit)            
# name 'na_omit' is not defined.

# m4  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action=ro.r(na_omit))     
# name 'na_omit' is not defined. 

# m5  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action='na_omit')        
# Error in na.fail.default(as.ts(x)): missing values in object 

# m6  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action=ro.r('na_omit'))  
# Error in (function(expr,envir=parent.frame(),enclos=if(is.list(envir) || object 'na_omit' not found)))
 
# m7  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action=na.omit)          
# name 'na' is not defined 

# m8  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action=ro.r(na.omit))      
# name 'na' is not defined

# m9  = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action='na.omit')        
# Error in na.fail.default(as.ts(x)): missing values in object

# m10 = ro.r.glmmTMB(formula=ro.r("cbind(Success,na_action=ro.r('na.omit'))   
# Error in na.fail.default(as.ts(x)): missing values in object 

解决方法

如果命名参数 na.action 在函数 glmmTMB() 的签名中,您应该能够做到

m = ro.r.glmmTMB(<blah>,na_action=<your value>)

文档在这里:https://rpy2.github.io/doc/v3.4.x/html/robjects_functions.html?highlight=function#callable

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。