2016-03-02 108 views
0

我使用partykit並注意到可能的varid不匹配(除非我誤解了某些內容)。以下是示例代碼。partykit對象varid不匹配

nodeapply返回的根節點顯示變量5爲分割變量。

另外,明確地生成的列表的所述第一元件具有split$varid 5.如果我們看一下iris數據幀,則第五列是Species,和Petal.Width是第四列,其應該是varid根節點如由j48_party對象。

看起來好像varid是使用+1的實際功能,這是故意的嗎?

> library(partykit) 
> library(RWeka) 
> data("iris") 
> j48 <- J48(Species~., data=iris) 
> j48_party <- as.party(j48) 
> j48_party 

Model formula: 
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width 

Fitted party: 
[1] root 
| [2] Petal.Width <= 0.6: setosa (n = 50, err = 0.0%) 
| [3] Petal.Width > 0.6 
| | [4] Petal.Width <= 1.7 
| | | [5] Petal.Length <= 4.9: versicolor (n = 48, err = 2.1%) 
| | | [6] Petal.Length > 4.9 
| | | | [7] Petal.Width <= 1.5: virginica (n = 3, err = 0.0%) 
| | | | [8] Petal.Width > 1.5: versicolor (n = 3, err = 33.3%) 
| | [9] Petal.Width > 1.7: virginica (n = 46, err = 2.2%) 

Number of inner nodes: 4 
Number of terminal nodes: 5 
> colnames(iris) 
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"  
> nodeapply(j48_party) 
$`1` 
[1] root 
| [2] V5 <= 0.6 * 
| [3] V5 > 0.6 
| | [4] V5 <= 1.7 
| | | [5] V4 <= 4.9 * 
| | | [6] V4 > 4.9 
| | | | [7] V5 <= 1.5 * 
| | | | [8] V5 > 1.5 * 
| | [9] V5 > 1.7 * 

> nodes <- as.list(j48_party$node) 
> nodes[[1]]$split$varid 
[1] 5 

回答

0

的差異是由於以下:J48()像大多數其他建模功能(如lm()glm()等)並不簡單地直接使用data提供,但首先構建了一個model.frame。這已經執行了變量轉換(例如,記錄日誌,創建因子或對象),收集可能不在data中但在呼叫環境中的變量,並且忽略不在formula等模型中的變量。有關詳細信息,請參見?model.frame信息和鏈接。

因此,通過J48()創建的對象具有一個不完全iris數據但響應變量被轉移到第一列中的model.frame

head(model.frame(j48)) 
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
## 1 setosa   5.1   3.5   1.4   0.2 
## 2 setosa   4.9   3.0   1.4   0.2 
## 3 setosa   4.7   3.2   1.3   0.2 
## 4 setosa   4.6   3.1   1.5   0.2 
## 5 setosa   5.0   3.6   1.4   0.2 
## 6 setosa   5.4   3.9   1.7   0.4 

而從這個信息也被攜帶到party對象。

j48_party$data 
## [1] Species  Sepal.Length Sepal.Width Petal.Length Petal.Width 
## <0 rows> (or 0-length row.names) 

[注:在J48()的情況下,這只是存儲在元信息,但因爲這裏不需要它丟棄了實際數據。但是,這是ctree()例如不同]

一看就知道model.frame()可以從原始數據考慮以下情況不同。我們創建了一個新的noise變量,是不是部分的iris,但只是在呼叫環境,取日誌,並省略幾個變量:

set.seed(1) 
noise <- rnorm(150) 
j48 <- J48(Species ~ log(Petal.Width) + noise, data = iris) 
j48_party <- as.party(j48) 
head(model.frame(j48)) 
## Species log(Petal.Width)  noise 
## 1 setosa  -1.6094379 -0.6264538 
## 2 setosa  -1.6094379 0.1836433 
## 3 setosa  -1.6094379 -0.8356286 
## 4 setosa  -1.6094379 1.5952808 
## 5 setosa  -1.6094379 0.3295078 
## 6 setosa  -0.9162907 -0.8204684 
j48_party$data 
## [1] Species   log(Petal.Width) noise   
## <0 rows> (or 0-length row.names) 
+0

感謝您的澄清和快速響應。 –