Проблемы с RPART, Rpart пропускают данные правильно из Python на R

StackOverflow https://stackoverflow.com/questions/4434783

  •  09-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь запустить rpart через RPY2, используя Python 2.6.5 и R 10.0.

Я создаю кадр данных в Python и пропустите его, но я получаю ошибку:

Error in function (x)  : binary operation on non-conformable arrays
Traceback (most recent call last):
  File "partitioningSANDBOX.py", line 86, in <module>
    model=r.rpart(**rpart_params)
  File "build/bdist.macosx-10.3-fat/egg/rpy2/robjects/functions.py", line 83, in __call__
  File "build/bdist.macosx-10.3-fat/egg/rpy2/robjects/functions.py", line 35, in __call__
rpy2.rinterface.RRuntimeError: Error in function (x)  : binary operation on non-conformable arrays

Может кто-нибудь помочь мне определить, что я делаю не так, чтобы бросить эту ошибку?

Соответствующая часть моего кода это:

import numpy as np
import rpy2
import rpy2.robjects as rob
import rpy2.robjects.numpy2ri


#Fire up the interface to R
r = rob.r
r.library("rpart")

datadict = dict(zip(['responsev','predictorv'],[cLogEC,csplitData]))
Rdata = r['data.frame'](**datadict)
Rformula = r['as.formula']('responsev ~.')
#Generate an RPART model in R.
Rpcontrol = r['rpart.control'](minsplit=10, xval=10)
rpart_params = {'formula' : Rformula, \
       'data' : Rdata,
       'control' : Rpcontrol}
model=r.rpart(**rpart_params)

Две переменные Clogec и CSPlitData являются применяющими массивами поплавкового типа.

Кроме того, моя рамка данных выглядит так:

In [2]: print Rdata
------> print(Rdata)
   responsev predictorv
1  0.6020600        312
2  0.3010300        300
3  0.4771213        303
4  0.4771213        249
5  0.9242793        239
6  1.1986571        297
7  0.7075702        287
8  1.8115750        270
9  0.6020600        296
10 1.3856063        248
11 0.6127839        295
12 0.3010300        283
13 1.1931246        345
14 0.3010300        270
15 0.3010300        251
16 0.3010300        246
17 0.3010300        273
18 0.7075702        252
19 0.4771213        252
20 0.9294189        223
21 0.6127839        252
22 0.7075702        267
23 0.9294189        252
24 0.3010300        378
25 0.3010300        282

И формула выглядит так:

In [3]: print Rformula
------> print(Rformula)
responsev ~ .
Это было полезно?

Решение

Проблема связана с r идиосинкратический код в rpart (быть точным, следующим блоком, в частности, последней строкой:

m <- match.call(expand.dots = FALSE)
m$model <- m$method <- m$control <- NULL
m$x <- m$y <- m$parms <- m$... <- NULL
m$cost <- NULL
m$na.action <- na.action
m[[1L]] <- as.name("model.frame")
m <- eval(m, parent.frame())

).

Один из способов работать вокруг этого, чтобы избежать ввода этого блока кода (см. Ниже) или, может быть, чтобы построить вложенную оценку из Python (так что родитель. Слава () ведет себя). Это не так просто, как можно надеяться, но возможно, я насмотру времени, чтобы облегчить в будущем.

from rpy2.robjects import DataFrame, Formula
import rpy2.robjects.numpy2ri as npr
import numpy as np
from rpy2.robjects.packages import importr
rpart = importr('rpart')
stats = importr('stats')

cLogEC = np.random.uniform(size=10)
csplitData = np.array(range(10), 'i')

dataf = DataFrame({'responsev': cLogEC,
                   'predictorv': csplitData})
formula = Formula('responsev ~.')
rpart.rpart(formula=formula, data=dataf, 
            control=rpart.rpart_control(minsplit = 10, xval = 10),
            model = stats.model_frame(formula, data=dataf))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top