用于计算黄土跨度优化的 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"),因为这是鼓励的做法,因为 类 通常可以有多个值。