использовать модель.matrix через rpy2?

Я предпочитаю python над R для моей работы. Время от времени мне нужно использовать R-функции, и я начинаю попробовать Rpy2 для этой цели.

Я пробовал, но не смог узнать, как реплицировать следующий с помощью Rpy2

design <- model.matrix(~Subject+Treat) 

Я дошел до этого:

 import rpy2.robjects as robjects fmla = robjects.Formula('~subject+treatment') env = fmla.environment env['subject'] = sbj_group env['treatment'] = trt_group 

от того, что я увидел здесь . Но я не мог найти, как выполнить model.matrix . Я попробовал пару разных способов:

 robjects.r.model_matrix(fmla) robjects.r('model.matrix(%s)' %fmla.r_repr()) 

Как видите, никто из них не прав.

Я новичок в Rpy2 и довольно неопытный в R. Любая помощь была бы оценена!

Вы можете оценивать строки как R-код :

 import numpy as np import rpy2.robjects as ro import rpy2.robjects.numpy2ri ro.numpy2ri.activate() R = ro.r subject = np.repeat([1,2,3], 4) treatment = np.tile([1,2,3,4], 3) R.assign('subject', subject) R.assign('treatment', treatment) R('subject <- as.factor(subject)') R('treatment <- as.factor(treatment)') R('design <- model.matrix(~subject+treatment)') R('print(design)') 

доходность

  (Intercept) subject2 subject3 treatment2 treatment3 treatment4 1 1 0 0 0 0 0 2 1 0 0 1 0 0 3 1 0 0 0 1 0 4 1 0 0 0 0 1 5 1 1 0 0 0 0 6 1 1 0 1 0 0 7 1 1 0 0 1 0 8 1 1 0 0 0 1 9 1 0 1 0 0 0 10 1 0 1 1 0 0 11 1 0 1 0 1 0 12 1 0 1 0 0 1 attr(,"assign") [1] 0 1 1 2 2 2 attr(,"contrasts") attr(,"contrasts")$subject [1] "contr.treatment" attr(,"contrasts")$treatment [1] "contr.treatment" при  (Intercept) subject2 subject3 treatment2 treatment3 treatment4 1 1 0 0 0 0 0 2 1 0 0 1 0 0 3 1 0 0 0 1 0 4 1 0 0 0 0 1 5 1 1 0 0 0 0 6 1 1 0 1 0 0 7 1 1 0 0 1 0 8 1 1 0 0 0 1 9 1 0 1 0 0 0 10 1 0 1 1 0 0 11 1 0 1 0 1 0 12 1 0 1 0 0 1 attr(,"assign") [1] 0 1 1 2 2 2 attr(,"contrasts") attr(,"contrasts")$subject [1] "contr.treatment" attr(,"contrasts")$treatment [1] "contr.treatment" 

R(...) возвращает объекты, которые вы можете манипулировать на стороне Python. Например,

 design = R('model.matrix(~subject+treatment)') 

назначает rpy2.robjects.vectors.Matrix для design .

 arr = np.array(design) 

делает arr массивом NumPy

 [[ 1. 0. 0. 0. 0. 0.] [ 1. 0. 0. 1. 0. 0.] [ 1. 0. 0. 0. 1. 0.] [ 1. 0. 0. 0. 0. 1.] [ 1. 1. 0. 0. 0. 0.] [ 1. 1. 0. 1. 0. 0.] [ 1. 1. 0. 0. 1. 0.] [ 1. 1. 0. 0. 0. 1.] [ 1. 0. 1. 0. 0. 0.] [ 1. 0. 1. 1. 0. 0.] [ 1. 0. 1. 0. 1. 0.] [ 1. 0. 1. 0. 0. 1.]] 

Имена столбцов можно получить с помощью

 np.array(design.colnames) # array(['(Intercept)', 'subject2', 'subject3', 'treatment2', 'treatment3', # 'treatment4'], # dtype='|S11') 
Interesting Posts