"错误" ...二元运算符"的非数字参数,但所有变量都是数字

时间:2016-01-03 22:45:06

标签: r

我在R版本3.2.2中拟合了一个Boosted回归模型,我的所有变量都是数字,但由于这个错误我无法继续#34;总错误.deviance / n.cases:non - 二元运算符的数字参数"。我的数据结构如下:

 str(uffe.data)
'data.frame':   1437 obs. of  7 variables:
 $ uffespeed  : num  0.162 0.298 0.317 0.261 0.759 ...
 $ uffepike   : num  0.419 0.419 0.419 0.419 0.419 ...
 $ uffeslope  : num  1.863 2.374 1.647 2.003 0.737 ...
 $ uffepop0999: num  15.6 15.6 15.6 15.6 15.6 ...
 $ uffedwater : num  359 2778 3112 2310 2726 ...
 $ uffedtown  : num  14139 11713 11330 12020 11654 ...
 $ ufferoads  : num  0 0 0 0 0 0 0 0 0 0 ...

我的模特是:

   uffebrt <- gbm.step(data=uffe.data, gbm.x = 2:7, 
     gbm.y = 1, family =      "gamma", tree.complexity = 5, 
     learning.rate = 0.01,bag.fraction = 0.5)

执行过早结束如下:

Length  Class   Mode 
     0   NULL   NULL 

GBM STEP - version 2.9 


Performing cross-validation optimisation of a boosted regression tree model 
for uffespeed with dataframe uffe.data and using a family of gamma 

Using 1437 observations and 6 predictors 

Error in total.deviance/n.cases : non-numeric argument to binary operator

我哪里错了?

1 个答案:

答案 0 :(得分:1)

gbm.step包中的dismo功能允许family成为:'bernoulli''binomial''poisson',{{1}之一},或'laplace'。如果您提供的家庭不是其中之一,则由'gaussian'调用的calc.deviance会引发以下错误:

gbm.step

您的错误消息表明Error in calc.deviance(y_i, u_i, weights = site.weights, family = family, : unknown family, should be one of: "binomial", "bernoulli", "poisson", "laplace", "gaussian" 未按预期抛出该错误,因为calc.deviance(在您的错误消息中引用)在调用{{1}后(直接)出现} total.deviance/n.cases的来源。

该错误导致calc.deviancegbm.step中的一个或另一个是非数字的。从查看来源我们可以安全地假设它不是total.deviance ,.这会留下n.cases,这是n.cases调用的结果。我的猜测是,出于某种原因,total.deviance正在为calc.deviance分配一个字符串。

我无法解释为什么会发生这种情况,但是根据您的意见,我怀疑使用其中一个接受的家庭将解决您的问题。你在新的R会话中得到错误吗?也许如果您从CRAN重新安装calc.deviance,它可能会按预期运行。

为了将来参考,total.deviance函数对于探索这些问题非常有用,因为它允许您逐步浏览源,检查在任何点创建的对象。

作为旁注,打印到屏幕上的信息错误地表明可能支持gamma系列,因为它显示:

dismo

但请考虑以下提供的debug以及随后的消息:

## Performing cross-validation optimisation of a boosted regression tree model 
## for uffespeed with dataframe uffe.data and using a family of gamma 

在执行错误检查之前打印消息,这有点误导。但至少在我的情况下,我也看到了:

family