2016-02-26 4 views
0

Я новичок в R (и rpart). У меня есть данные модели автомобиля (~ 400 моделей). Я использую rpart для группировки их в меньшее число (например, 5-10 групп), которые имеют аналогичные затраты на ремонт автомобилей. Я успешно управляю rpart и имею эти группировки.ссылки на терминальные узлы rpart в r

fit <- rpart(repairs ~ model, data=data, method='anova', control=rpart.control(minsplit=2,minbucket=1,cp=.0005))  

Предположим, что в каждом терминальном узле имеется примерно 40-80 моделей. Есть ли способ создать формулу, которая ссылается на значения в терминальном узле. Предполагая, что данные $ модель содержит все имена моделей (и является независимой переменной Я пытаюсь сделать что-то вроде:

data$modelgroup <- data$model 
data$modelgroup[data$modelgroup %in% terminal node 1] <- 'Group1' 
data$modelgroup[data$modelgroup %in% terminal node 2] <- 'Group2' 
and so on for the rest of the groups 

Кроме того, если бы существовал способ сделать это без необходимости иметь строку кода для каждая группа, которая будет хорошо.

Я знаю, что могу напечатать дерево и вручную скопировать текст из терминальных узлов и выполнить его таким образом, но это очень неэффективно.

заранее спасибо за вашу помощь !

Заново Квест ниже, я добавил воспроизводимый пример ниже.

data <- read.csv("rpart_example.csv") 
data 

data[,1:2] 

    Model Amount 
1  a  1 
2  a  1 
3  a  1 
4  b  1 
5  b  1 
6  b  1 
7  c  2 
8  c  2 
9  c  2 
10  d  2 
11  d  2 
12  d  2 
13  e  3 
14  e  3 
15  e  3 
16  f  4 
17  f  4 
18  f  4 

fit <- rpart(Amount ~ Model, data=data, method='anova', 
      control=rpart.control(minsplit=2,minbucket=1,cp=.0005)) 
print(fit) 

n= 18 

node), split, n, deviance, yval 
* denotes terminal node 

1) root 18 20.5 2.166667 
2) Model=a,b,c,d 12 3.0 1.500000 
4) Model=a,b 6 0.0 1.000000 * 
    5) Model=c,d 6 0.0 2.000000 * 
    3) Model=e,f 6 1.5 3.500000 
6) Model=e 3 0.0 3.000000 * 
    7) Model=f 3 0.0 4.000000 * 

# create a variable modelgroup that groups models per terminal nodes from rpart  

# I can do this manually as below 
# is there a way for me to automate this assignment? 

data$modelgroup <- as.character(data$Model) 

# per rpart output, a&b are grouped into one terminal node 
data$modelgroup[data$modelgroup %in% c('a','b')] <- 'Group1'  

# per rpart output, c&d are grouped into the second terminal node 
data$modelgroup[data$modelgroup %in% c('c','d')] <- 'Group2' 

# per rpart, e is the third terminal node 
data$modelgroup[data$modelgroup == 'e'] <- 'Group3' 

# per rpart, f is the fourth terminal node 
data$modelgroup[data$modelgroup == 'f'] <- 'Group4' 
+0

Если вам будет легче помочь, если вы предоставите минимальный [воспроизводимый пример]. Включите некоторые примеры данных и укажите желаемый результат для этого ввода. – MrFlick

+0

Я не уверен, что могу представить воспроизводимый пример, но, как показано на иллюстрации, скажем, после запуска rpart и печати (fit), один из терминальных узлов содержал FordTaurus, ChevyMalibu ... и еще 40 имен моделей. Скажем, я хочу назвать все модели, перечисленные в этом терминальном узле «Группа 1». Я, по сути, хочу сказать, что если имя модели находится в этом списке, вызовите его «Группа 1» и сделайте это для каждого из терминальных узлов. – user3670204

+0

Непросто предложить гипотетические решения. Возможно, вы можете адаптировать пример на странице справки «rpart», чтобы сделать воспроизводимый пример. – MrFlick

ответ

1

В rpart объекты информацию, которую вы ищете, по существу, легко хранится в $where элемента. Это дает вам номер узла, к которому каждое наблюдение назначается:

table(fit$where, data$modelgroup) 
##  Group1 Group2 Group3 Group4 
## 3  6  0  0  0 
## 4  0  6  0  0 
## 6  0  0  3  0 
## 7  0  0  0  3 

Конечно, вы также можете переключать идентификаторы узлов (3, 4, 6, 7) к факторной переменной или символьной, например, factor(fit$where, levels = c(3, 4, 6, 7), labels = paste0("Group", 1:4)) или что-то вдоль этой линии.

Если вы хотите сделать это на новых данных с помощью простого и единого интерфейса, вы можете превратить ваш rpart объект в party объекта в пакете partykit:

library("partykit") 
fit2 <- as.party(fit) 

Унифицированные методы print(fit2) и plot(fit2) доступны а также predict(fit2, ...) с различными типами:

table(predict(fit2, newdata = data, type = "node"), data$modelgroup) 
##  Group1 Group2 Group3 Group4 
## 3  6  0  0  0 
## 4  0  6  0  0 
## 6  0  0  3  0 
## 7  0  0  0  3 

Это возвращает тот же результат, что и выше, но может быть легко применен к Ot ее newdata также.

+0

Благодарим за отзыв. Я ценю это! Я попытался использовать предложенный код (таблица (fit $ where, data $ modelgroup)), но получил сообщение об ошибке. Я также смущен тем, что это намеревается сделать.В моем примере выше, как я могу использовать это, чтобы назначить «Группу 1» новой группе переменных $ modelgroup для моделей a & b (поскольку они вместе в первом терминальном узле)? – user3670204

+0

Таблица должна показывать, что группировка из 'fit $ where' и построенная вручную модельная группа совпадают, т. Е. Предоставляют одну и ту же групповую информацию. Я не могу прокомментировать ошибку без самодостаточного примера, воспроизводящего сообщение об ошибке. Пример, который я использовал, - это простой набор данных 18 наблюдений, который вы опубликовали. –

+0

Благодарим вас за разъяснения. Я заработал. Я ценю вашу помощь! – user3670204