2016-06-11 136 views
0

我正在寻找帮助,因为我一直在这段代码上停留了一段时间。我想评估我的回归模型RMLSE(均方根误差对数),使用此代码:RMSLE R中的评估

rmlse <- function(model) { 
    y <- testset$Counts 
    y.pred <- predict(model, testset) 
    return(sqrt(1/nrow(y)*sum((log(y.pred +1)-log(testset$Counts +1))^2))) 
} 

,其中重要的是我的因变量。但是,这只会产生NaN。数据集中没有NA。我似乎无法弄清楚错误发生在哪里,如果有人能够帮助它,我们将非常感谢!

+1

很难说没有一个可重复的例子。你能分享你的数据集的代码片段和从这些数据得到的NaN结果的代码吗? – ulfelder

+0

计算函数外的所有值并检查每个错误。 –

+1

这可能是因为您的数据中可能有一些小于-1的值。在这种情况下,'log(yourvalue + 1)'产生'NaN'。 –

回答

1

我觉得你的问题是在哪里nrow(y)因为y <- testset$Countsy一个载体,nrow(y)应该返回NULL。看到这个例子:

set.seed(10) 
mydat<-data.frame(a=1:10, b = rnorm(10), c = rpois(10, 1)) 

y<-mydat$a 
nrow(y) 
NULL 

如果更改nrow()length()你应该确定。

model<-lm(a~b+c, data = mydat[1:5,]) 
rmlse <- function(model) { 
    y <- mydat$a 
    y.pred <- predict(model, mydat[6:10,]) 
    return(sqrt(1/length(y)*sum((log(y.pred +1)-log(mydat$a +1))^2))) 
} 

rmlse(model) 
[1] 0.6234257 

但请务必注意yy.pred最终被相同的长度,否则会抛出一个错误,因为我发现了以前。我编辑它运行正确,但我想我会让你知道。如果它们长度不一样,你会得到:

Warning message: 
    In log(y.pred + 1) - log(mydat$a + 1) : 
    longer object length is not a multiple of shorter object length 
+0

它现在可以工作!非常感谢您的帮助! – Veraaa