我正在尝试使用party
包运行随机林模型。我的响应变量(10个级别)是不同湖泊类型的分类值(感兴趣的是哪些因素会影响基于水质属性的湖泊聚类)。我的预测变量包括连续变量和分类变量。一个分类变量有4个级别,另一个分类变量有8个级别(美国湖泊位于其中)。每当我在模型中包含第二个分类变量时,我都会收到以下错误:
Error in model@fit(data, ...) : error code 1 from Lapack routine 'dgesdd'.
我已经能够将其缩小到预测变量超过4个分类级别时,cforest
包中的party
例程似乎无法运行的事实。我不确定这对其他数据集是否属实,或者仅仅是我的特征。 Google建议错误代码可能与收敛问题相关联。是否有人了解cforest
例程中与分类预测器级别相关的限制(例如randomForest
包中的randomForest
限制为32级?我还没有看到任何明确讨论party
包的内容。一种解决方案是将此因子重新编码为单独的虚拟变量,但我想避免这种情况。根据我的数据cforest
appears to be recommended over randomForest
的特征(相关预测因子,不同级别的因素,连续和分类数据的混合)。
非常感谢任何见解。
链接到虚拟数据集(实际数据只是有限数量的变量):https://dl.dropboxusercontent.com/u/8554679/newdata.csv
library(RCurl)
library(party)
x = getURL("https://dl.dropboxusercontent.com/u/8554679/newdata.csv")
new.data = read.csv(text = x,header=TRUE)
new.data$response = as.factor(new.data$response)
new.data$factor1 = as.factor(new.data$factor1)
new.data$factor2 = as.factor(new.data$factor2)
set.seed(1123)
data.controls = data.controls = cforest_unbiased(ntree=500, mtry=3)
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred4 + factor2 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
#excuting this results in the following error: Error in model@fit(data, ...) : error code 1 from Lapack routine 'dgesdd'
#remove factor2 which has 8 levels from the formula
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
levels(new.data$factor2)
#arbitrarily reassign factor2 levels such that there are only 4 levels
#I've tried levels between 8 and 4 and it turns out it only works if factors have <=4 levels
random.rows = sample(x=c(1:nrow(new.data)),size=nrow(new.data),replace=FALSE)
new.data$factor2 = NA
new.data$factor2[random.rows[1:120]] = 1
new.data$factor2[random.rows[121:241]] = 2
new.data$factor2[random.rows[242:362]] = 3
new.data$factor2[random.rows[363:483]] = 4
new.data$factor2 = as.factor(new.data$factor2)
levels(new.data$factor2)
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred4 + factor2 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
#model runs fine.
SessionInfo()请求:
sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats4 grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] party_1.0-13 modeltools_0.2-21 strucchange_1.5-0 sandwich_2.3-0 zoo_1.7-11 RCurl_1.95-4.1
[7] bitops_1.0-6
loaded via a namespace (and not attached):
[1] coin_1.0-23 lattice_0.20-29 mvtnorm_0.9-99992 splines_3.0.3 survival_2.37-7 tools_3.0.3
答案 0 :(得分:1)
迟到的答案,但仍然是一个答案 我有同样的问题。通过关闭并重新打开R-Studio解决了这个问题。在我看来,它是插入符号和派对包之间的冲突,它们都被加载了。只要我加载了派对套餐,问题就消失了。
答案 1 :(得分:0)
我遇到了类似的问题。 当我对某些数据运行以下命令时,我遇到了同样的错误:
tree = ctree(Y~., data=df[,-c(1,11:15)], controls = controls)
给出了:
Error in model@fit(data, ...) :
error code 19 from Lapack routine 'dgesdd'
除响应外的所有变量都是数字。 我可以&#34;克服&#34;将代码更改为:
的错误tree = ctree(Y~., data=df[,-c(1,11,12,13,14,15)], controls = controls)
所以,我认为,这是一个错误。但是,你可以以类似的方式解决问题:
data.cforest = cforest(response ~., data=new.data,controls=data.controls)
但是你的代码不会导致我的机器出错,但运行正常,所以我无法测试它。
答案 2 :(得分:0)
我发现了同样的问题,我无法复制。在我的情况下,我通过手动设置分类为字符的列,然后是因子来解决问题。即:data $ classifier = as.factor(as.character(data $ classifier))