2016-07-13 3 views
2

У меня есть матрицу 440 * 2, который выглядит как:Plot дерево решений с R

1 144 
1 152 
1 135 
2 3 
2 12 
2 107 
2 31 
3 4 
3 147 
3 0 
4 end 
4 0 
4 0 
5 6 
5 7 
5 10 
5 9 

В левой колонке являются отправными точками, например, в приложении все 1 на левом будет на той же странице , Они приводят к трем вариантам, стр. 144, 152, 135. Эти страницы могут каждый раз приводить к другой странице и так далее, пока в правой колонке не будет указано «конец». Я бы хотел, чтобы визуализировать масштаб этого дерева. Я понимаю, что он будет достаточно большим, если вы укажете nb строк, поэтому, возможно, не графически, так что для ясности я хочу знать, сколько возможных маршрутов есть в целом (с каждой начальной точки, вниз по каждому параметру, который она дает, и конечных пунктов назначения каждого Я понимаю, что будут перекрытия, но именно поэтому мне сложно это вычислить).

Во-вторых, каждое число имеет ассоциированное название. Я хотел бы иметь функцию, при которой, если вы введете данный заголовок, он построит все возможные отправные точки и связанные с ними пути, которые приведут туда. Это должно быть намного меньше и, следовательно, графически.

например.

dta <- " 
14 12 as 
186 187 Frac 
187 154 Low 
23 52 Med 
52 11 Lip 
15 55 asd 
11 42 AAA 
42 154 BBB 
154 end Coll" 

отредактированные пример данных, чтобы показать, что некоторые ветви не подключены к желаемому дереву

dta <- " 
    14 12 as 
    186 187 Frac 
    187 154 Low 
    23 52 Med 
    52 11 Lip 
    11 42 AAA 
    42 154 BBB 
    154 end Coll" 

dta <- gsub(" ", ",", dta, fixed = TRUE) 
dta <- gsub(" ", ",", dta, fixed = TRUE) 

df <- read.csv(textConnection(dta), stringsAsFactors = FALSE, header = FALSE) 
names(df) <- c("from", "to", "nme") 
library(data.tree) 
Warning message: 
package ‘data.tree’ was built under R version 3.2.5 
tree <- FromDataFrameNetwork(df) 
**Error in FromDataFrameNetwork(df) :** 
    **Cannot find root name. network is not a tree!** 

Я сделал этот пример, чтобы показать, как столбец 1 приводит к значению в колонке 2, который затем обращается к значение в столбце 1, пока вы не достигнете конца. Различные исходные точки могут в конечном итоге привести к разным путям длины к тому же месту назначения. так что это будет выглядеть sometigng как: All paths leads to Coll

Так вот, я хотел бы посмотреть, как вы могли бы перейти от всех стартовых точек на «Coll»

очень признателен за любую помощь

+0

У меня нет ответа для вас, но, возможно, [это] (Http: //blog.revolutionanalytics.com/2013/06/plotting-classic-and-regression-trees-with-plotrpart.html) поможет. –

+0

спасибо Тиму. Но не rpart классифицировать данные, а не строить его как есть? или, если нет, как мне заставить его просто построить дерево, как я описал выше? – cianius

+0

prp() в rpart.plot может дать вам некоторые идеи. Ищите код внутри функции. – abhiieor

ответ

2

Если у вас есть на самом деле дерево (например, без циклов), вы можете использовать data.tree:

Start путем преобразования в data.frame:

dta <- " 
14 12 as 
186 187 Frac 
187 154 Low 
23 52 Med 
52 11 Lip 
15 55 asd 
11 42 AAA 
42 154 BBB 
154 end Coll 
55 end efg 
12 end hij" 

dta <- gsub(" ", ",", dta, fixed = TRUE) 
dta <- gsub(" ", ",", dta, fixed = TRUE) 


df <- read.csv(textConnection(dta), stringsAsFactors = FALSE, header = FALSE) 
names(df) <- c("from", "to", "nme") 

сейчас , Преобразовать в data.tree:

library(data.tree) 
tree <- FromDataFrameNetwork(df) 

tree$leafCount 

Теперь вы можете перейти к любому поддереву, для анализа и черчения. Например. используя любой из следующих возможностей:

subTree <- tree$FindNode(187) 
subTree <- Climb(tree, nme = "Coll", nme = "Low") 
subTree <- tree$`154`$`187` 

subTree <- Clone(tree$`154`) 

Может печать все, что вам нужно:

print(subTree , "nme") 

Это будет печатать как так:

levelName   nme 
1 154    Coll 
2 ¦--187    Low 
3 ¦ °--186  Frac 
4 °--42    BBB 
5  °--11   AAA 
6   °--52  Lip 
7    °--23 Med 

В противном случае, используйте фантазию заговоры:

SetNodeStyle(subTree , style = "filled,rounded", shape = "box", fontname = "helvetica", label = function(node) node$nme, tooltip = "name") 
plot(subTree , direction = "descend") 

Это выглядит как это:

enter image description here

+0

это отлично выглядит. но пример, который я дал, является упрощением. Реальные данные больше похожи на первый набор, где не все строки приводят к Coll. Как бы вы просто закрепили соответствующие строки Coll? – cianius

+0

Вы можете перейти к любому поддереву, например. 'subTree <- tree $ FindNode (187)' или 'subTree <- Climb (tree, nme =" Coll ", nme =" Low ")' –

+0

Мне жаль, я не привык к подобной работе, поэтому моя терминология, вероятно, выкл. Я попытался прояснить этот пример. Я не могу перейти к поддереву, потому что исходный фреймворк имеет строки, которые не приводят к coll и, следовательно, не связаны с нужным деревом. Это означает, что я получаю код ошибки Ive, добавленный для сообщения об этом, не являющемся деревом. – cianius

Смежные вопросы