2016-05-20 10 views
1

Ich habe eine Reihe von Bäumen, beim Drucken sind sie 7 Seiten lang. Ich musste die Daten neu ausgleichen und die Zweige mit der höchsten Häufigkeit untersuchen, um zu sehen, ob sie sinnvoll sind - ich muss eine Abbruchrate für verschiedene Cluster identifizieren.Gehen Sie einen CHAID-Baum R - müssen nach Anzahl der Instanzen sortieren

Angesichts der Daten ist so lang, was ich brauche, um die größten Zweige zu haben, und dann kann ich diese validieren, anstatt 210 Zweige manuell zu durchlaufen. Ich werde viele Bäume haben, also muss ich das automatisieren, um die wichtigen Ergebnisse zu sehen.

Beispielcode zu verwenden:

library(CHAID) 
updatecars<-mtcars 
updatecars$cyl<-as.factor(updatecars$cyl) 
updatecars$vs<-as.factor(updatecars$vs) 
updatecars$am<-as.factor(updatecars$am) 
updatecars$gear<-as.factor(updatecars$gear) 
plot(carsChaid) 

carsChaid<-chaid(am~ cyl+vs+gear, data=updatecars) 
carsChaid 

Wenn Sie diese Daten zu drucken, Sie sehen, n = 15 für die erste Gruppe. Ich brauche einen Tisch, wo ich diesen Wert sortieren kann.

Was ich brauche, ist eine Entscheidungsbaumtabelle mit den Variablenwerten und der Nummer innerhalb jeder Gruppe aus der Baumstruktur. Dies ist nicht genau das gleiche wie diese Antwort Walk a tree wie es nicht die Zahl innerhalb gibt, aber ich denke, es ist in der Richtung.

kann jemand helfen,
Danke,
James

Antwort

0

Sicher gibt einen besseren Weg, dies aber diese works.Obviously bereit zu tun, Korrekturen und Verbesserungen haben vorgeschlagen.

Das besondere Problem, das ich hatte, war die Erstellung der Liste aller Kombinationen. Wenn das expand.grid über 3 Faktoren hinausgeht, hört es auf zu arbeiten. Also musste ich eine Schleife daraus erstellen, um die komplette Liste zu erstellen.

All_canx_rates<-function(Var1,Var2,Var3,Var4,Var5,nametree){ 
    df1<-data.frame("CanxRate"=0,"Num_Canx"=0,"Num_Cust"=0) 
    pars<-as.list(match.call()[-1]) 
    a<-eval(pars$nametree)[,as.character(pars$Var1)] 
    b<-eval(pars$nametree)[,as.character(pars$Var2)] 
    c<-eval(pars$nametree)[,as.character(pars$Var3)] 
    d<-eval(pars$nametree)[,as.character(pars$Var4)] 
    e<-eval(pars$nametree)[,as.character(pars$Var5)] 

    allcombos<-expand.grid(levels(a),levels(b),levels(c)) 
    clean<- allcombos 
    allcombos$Var4<-d[1] 

    for (i in 2:length(levels(d))) { 
    clean$Var4<-levels(d)[i] 
    allcombos<-rbind(allcombos,clean) 
    } 

    #define a forloop 
    for (i in 1:nrow(allcombos)) { 
    #define values 
    f1<-allcombos[i,1] 
    f2<-allcombos[i,2] 
    f3<-allcombos[i,3] 
    f4<-allcombos[i,4] 

    y5<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4 & 
         e =='1'),]) 
    y4<-nrow(nametree[(a %in% f1 & b %in% f2 & c %in% f3 & d %in% f4),]) 
    df2<-data.frame("CanxRate"=y5/y4,"Num_Canx"=y5,"Num_Cust"=y4) 
    df1<-rbind(df1, df2) 

    } 
    #endforloop 
    #make the dataframe available for global viewing 
    df1<-df1[-1,] 
    output<<-cbind(allcombos,df1) 
    } 
0

Sie können data.tree weitere Operationen auf einer Party Objekt zu tun, verwenden wie Sortierung, zu Fuß den Baum, benutzerdefinierte Zeichnen etc. Die neueste Version v0.3.7 von Github eine Umwandlung von Partei Klassenobjekten hat:

devtools::install_github("gluc/[email protected]") 
library(data.tree) 
tree <- as.Node(carsChaid) 

tree$fieldsAll 

der letzte Befehl zeigt die Namen der konvertierten Felder der Partei Klasse:

[1] "data"  "fitted"  "nodeinfo" "partyinfo" "split"  "splitlevels" "splitname" "terms"  "splitLevel" 

Sie durch eine Funktion sortieren, zB die Reihen der Daten auf jedem Knoten:

tree$Sort(attribute = function(node) nrow(node$data), decreasing = TRUE) 

print(tree, 
     "splitname", 
     count = function(node) nrow(node$data), 
     "splitLevel") 

Diese Drucke, zum Beispiel, etwa so:

levelName splitname count splitLevel 
1  1   gear 32   
2  ¦--3    17  4, 5 
3  °--2    15   3