2014-06-15 64 views
2

我想在R中使用gbm.more函數。爲了清晰起見,我使用了規範化的虹膜數據。當我指定distribution =「multinomial」時,下面的代碼不起作用,但是當我指定distribution =「gaussian」時,代碼起作用。是否有這個原因,還是隻是一個功能的問題?R gbm.more()函數不適用於所有發行版?

data(iris) 
iris.mod=gbm(Species ~ ., distribution="multinomial", data=iris, 
      n.trees=200, shrinkage=0.01, verbose=FALSE, n.cores=1) 
iris.mod1=gbm.more(iris.mod,100,verbose=FALSE) 
+0

具體而言,會輸出以下錯誤:gbm.more中的錯誤(iris.mod,100,verbose = FALSE): 觀察結果不正確。 gbm()無法爲設計矩陣構建索引。可能是gbm中的錯誤或數據中的異常數據類型。 – user3742790

+0

我的問題是否過於具體,或者我是否將其發佈在錯誤的地方? – user3742790

回答

1

我會說在gbm有一個錯誤。如果你看看gbm.fit函數,他們會在將多項數據發送到底層的「gbm」C函數之前對其進行一系列轉換。這些轉換在返回結果之前「撤消」,並且在gbm.more函數中不會再次執行。

一個這樣的轉換是要確保數據中的第一個值與您的y變量中的每個n因子水平之一相關聯。其中一個解決方案是確保您的數據在首先調用gbm之前的格式。以下是我們如何轉換虹膜數據。

first.row <- tapply(1:nrow(miris), iris$Species, head,1) 
miris <- rbind(miris[first.row,], miris[-first.row,]) 

,我們看到前三行有數據爲每個不同的物種的價值

#head(miris) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2  setosa 
51   7.0   3.2   4.7   1.4 versicolor 
101   6.3   3.3   6.0   2.5 virginica 
2   4.9   3.0   1.4   0.2  setosa 
3   4.7   3.2   1.3   0.2  setosa 
4   4.6   3.1   1.5   0.2  setosa 

然後,您可以用

iris.mod=gbm(Species ~ ., distribution="multinomial", data=miris, 
    n.trees=200, shrinkage=0.01, verbose=FALSE, n.cores=1) 

,然後滿足您的數據運行

iris.mod1=gbm.more(iris.mod,100,verbose=FALSE) 

沒有錯誤。

我建議你向軟件包維護人員提交一個錯誤報告。這個問題似乎特定於「多項」分配。隨意包含此問題的鏈接。

+0

精彩,似乎已經解決了我的問題!非常感謝!我已經通過電子郵件向維護人員報告了可能的錯誤。 – user3742790

+0

嗯實際上這似乎並沒有完全解決問題。如果我運行iris.mod = gbm()並檢查樹的數量,我正確地得到了iris.mod $ n.trees = 200。但是,在我使用gbm.more()後,iris.mode $ n.trees = 900而不是300。 – user3742790

相關問題