L'astuce principale (comme précédemment pointé par @ G5W) est de prendre le sous-ensemble [id]
de l'objet party
puis d'extraire les données (par $data
ou en utilisant la fonction data_party()
) qui contient la réponse. Je recommanderais d'abord de construire une table avec des fréquences absolues, puis d'en calculer les fréquences relatives et marginales. Utilisation de l'objet irisct
la table ordinaire peut être obtenue par
tab <- sapply(1:length(irisct), function(id) {
y <- data_party(irisct[id])
y <- y[["(response)"]]
table(y)
})
tab
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## setosa 50 50 0 0 0 0 0
## versicolor 50 0 50 49 45 4 1
## virginica 50 0 50 5 1 4 45
Ensuite, nous pouvons ajouter un peu de mise en forme à un bel objet table
:
colnames(tab) <- 1:length(irisct)
tab <- as.table(tab)
names(dimnames(tab)) <- c("Species", "Node")
Et puis utilisez prop.table()
et margin.table()
pour calculer les fréquences nous sommes intéressés par.La méthode as.data.frame()
de transformation de la mise en page table
à un « long » data.frame
:
as.data.frame(prop.table(tab, 1))
## Species Node Freq
## 1 setosa 1 0.500000000
## 2 versicolor 1 0.251256281
## 3 virginica 1 0.322580645
## 4 setosa 2 0.500000000
## 5 versicolor 2 0.000000000
## 6 virginica 2 0.000000000
## 7 setosa 3 0.000000000
## 8 versicolor 3 0.251256281
## 9 virginica 3 0.322580645
## 10 setosa 4 0.000000000
## 11 versicolor 4 0.246231156
## 12 virginica 4 0.032258065
## 13 setosa 5 0.000000000
## 14 versicolor 5 0.226130653
## 15 virginica 5 0.006451613
## 16 setosa 6 0.000000000
## 17 versicolor 6 0.020100503
## 18 virginica 6 0.025806452
## 19 setosa 7 0.000000000
## 20 versicolor 7 0.005025126
## 21 virginica 7 0.290322581
as.data.frame(margin.table(tab, 2))
## Node Freq
## 1 1 150
## 2 2 50
## 3 3 100
## 4 4 54
## 5 5 46
## 6 6 8
## 7 7 46
Et les informations scission peut être obtenue avec le (encore désexporter) fonction .list.rules.party()
. Vous avez juste besoin de demander tous les ID de nœud (la valeur par défaut est d'utiliser uniquement les ID de nœud terminal):
partykit:::.list.rules.party(irisct, i = nodeids(irisct))
## 1
## ""
## 2
## "Petal.Length <= 1.9"
## 3
## "Petal.Length > 1.9"
## 4
## "Petal.Length > 1.9 & Petal.Width <= 1.7"
## 5
## "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length <= 4.8"
## 6
## "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length > 4.8"
## 7
## "Petal.Length > 1.9 & Petal.Width > 1.7"
Merci beaucoup Achim! Je me demandais comment obtenir tous les nœuds listés avec list.rules, je vais vérifier la fonction data_party aussi car je pense que ça sera utile aussi. –