用于计算黄土跨度优化的 SSE 的 R 函数 - 在代码中找不到错误
R function to calculate SSE for loess span optimisation - can't find error in code
代码来自 http://r-statistics.co/Loess-Regression-With-R.html,这正是我需要的,如果我能让它工作的话。
数据:
data(economics, package="ggplot2")
economics$index <- 1:nrow(economics)
economics <- economics[1:80, ]
计算 SSE 的函数:
calcSSE <- function(x){
loessMod <- try(loess(uempmed ~ index, data=economics, span=x), silent=T)
res <- try(loessMod$residuals, silent=T)
if(class(res)!="try-error"){
if((sum(res, na.rm=T) > 0)){
sse <- sum(res^2)
}
}else{
sse <- 99999
}
return(sse)
}
找出黄土的最佳 'span' 值:
optim(par=c(0.5), calcSSE, method="SANN")
问题在于,对于 10000 的函数计数,这应该产生 0.0543 的跨度和 3.85e-28 的可实现最小 SSE(这可以在 link 开头的 post), 但如果我 运行 它,它给出 0.5,SSE 99999 并且函数计数只有 2,所以它显然不起作用。
我是 运行在 RStudio 的 Win10 下使用 R 4.1.2。我唯一能想到的是,自从编写这段代码以来,R 中的一些主要内容已经发生了变化。任何修复它的帮助将不胜感激。
我认为问题出在这里:if((sum(res, na.rm=T) > 0)){
- 当残差之和可能相当合理地低于零时,这会不必要地触发向 sse <- 99999
的移动。如果你去掉那个条件,那么你会得到一个更合理的答案。 try()
函数应该捕获结果中发生的任何奇怪的事情。
data(economics, package="ggplot2")
economics$index <- 1:nrow(economics)
economics <- economics[1:80, ]
calcSSE <- function(x){
loessMod <- try(loess(uempmed ~ index, data=economics, span=x), silent=T)
res <- try(loessMod$residuals, silent=T)
if(!inherits(res, "try-error")){
sse <- sum(res^2)
}else{
sse <- 99999
}
return(sse)
}
optimize(calcSSE, c(0.01,1))
#> $minimum
#> [1] 0.04414211
#>
#> $objective
#> [1] 7.888609e-31
由 reprex package (v2.0.1)
于 2022-01-30 创建
请注意,我使用 optimize
而不是 optim
,因为如果只有一个参数被优化,则建议这样做。我还从输出中删除了警告。另外请注意,我将 class(res)!="try-error"
切换为 !inherits(res, "try-error")
,因为这是鼓励的做法,因为 类 通常可以有多个值。
代码来自 http://r-statistics.co/Loess-Regression-With-R.html,这正是我需要的,如果我能让它工作的话。 数据:
data(economics, package="ggplot2")
economics$index <- 1:nrow(economics)
economics <- economics[1:80, ]
计算 SSE 的函数:
calcSSE <- function(x){
loessMod <- try(loess(uempmed ~ index, data=economics, span=x), silent=T)
res <- try(loessMod$residuals, silent=T)
if(class(res)!="try-error"){
if((sum(res, na.rm=T) > 0)){
sse <- sum(res^2)
}
}else{
sse <- 99999
}
return(sse)
}
找出黄土的最佳 'span' 值:
optim(par=c(0.5), calcSSE, method="SANN")
问题在于,对于 10000 的函数计数,这应该产生 0.0543 的跨度和 3.85e-28 的可实现最小 SSE(这可以在 link 开头的 post), 但如果我 运行 它,它给出 0.5,SSE 99999 并且函数计数只有 2,所以它显然不起作用。
我是 运行在 RStudio 的 Win10 下使用 R 4.1.2。我唯一能想到的是,自从编写这段代码以来,R 中的一些主要内容已经发生了变化。任何修复它的帮助将不胜感激。
我认为问题出在这里:if((sum(res, na.rm=T) > 0)){
- 当残差之和可能相当合理地低于零时,这会不必要地触发向 sse <- 99999
的移动。如果你去掉那个条件,那么你会得到一个更合理的答案。 try()
函数应该捕获结果中发生的任何奇怪的事情。
data(economics, package="ggplot2")
economics$index <- 1:nrow(economics)
economics <- economics[1:80, ]
calcSSE <- function(x){
loessMod <- try(loess(uempmed ~ index, data=economics, span=x), silent=T)
res <- try(loessMod$residuals, silent=T)
if(!inherits(res, "try-error")){
sse <- sum(res^2)
}else{
sse <- 99999
}
return(sse)
}
optimize(calcSSE, c(0.01,1))
#> $minimum
#> [1] 0.04414211
#>
#> $objective
#> [1] 7.888609e-31
由 reprex package (v2.0.1)
于 2022-01-30 创建请注意,我使用 optimize
而不是 optim
,因为如果只有一个参数被优化,则建议这样做。我还从输出中删除了警告。另外请注意,我将 class(res)!="try-error"
切换为 !inherits(res, "try-error")
,因为这是鼓励的做法,因为 类 通常可以有多个值。