Я новичок в 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'
Если вам будет легче помочь, если вы предоставите минимальный [воспроизводимый пример]. Включите некоторые примеры данных и укажите желаемый результат для этого ввода. – MrFlick
Я не уверен, что могу представить воспроизводимый пример, но, как показано на иллюстрации, скажем, после запуска rpart и печати (fit), один из терминальных узлов содержал FordTaurus, ChevyMalibu ... и еще 40 имен моделей. Скажем, я хочу назвать все модели, перечисленные в этом терминальном узле «Группа 1». Я, по сути, хочу сказать, что если имя модели находится в этом списке, вызовите его «Группа 1» и сделайте это для каждого из терминальных узлов. – user3670204
Непросто предложить гипотетические решения. Возможно, вы можете адаптировать пример на странице справки «rpart», чтобы сделать воспроизводимый пример. – MrFlick