0

我在 R 中使用了一个名为“quantreg”的库,并尝试在时间序列的基础上估计完整的非参数分位数回归。为了获得统计上显着的结果,我尝试了很多变量和平滑参数值 (lambda)。但这很累而且非常耗时。因此,我想应用网格搜索,但这对我来说有点难。我想确定最佳平滑值,所以我应该构造一个 for 循环。但我希望该循环尝试每种组合。在我想获得最佳模型或模型的 lambda 值(所有变量的 p 值<0.05 条件)。例如,如果我的方程式中有三个变量,我会这样写:

lambdas1<-rbind(1,2,3)
lambdas2<-rbind(1,2,3)
lambdas3<-rbind(1,2,3)
    
mylist<-list()
    for (i in 1:3) {
      for (j in 1:3) {
        for (n in 1:3) {
          f <-try(rqss(Y~qss(X1,lambda = lambdas1[i])+qss(X2,lambda = lambdas2[j])+qss(X3,lambda = lambdas3[n]), tau=0.05)) 
          sf<-summary(f)
          if( (sf[["qsstab"]]['X1','Pr(>F)']<0.05)&(sf[["qsstab"]]['X2','Pr(>F)']<0.05)&(sf[["qsstab"]]['X3','Pr(>F)']<0.05) ){
            mylist[[i]]<-f$lambdas
          }
        }
      }
    }

如何重新排列此代码?有什么捷径吗?

任何帮助将不胜感激。先感谢您。

4

1 回答 1

0

您可以使用baseR expand.grid创建data.frame所有可能的组合,然后使用它来循环遍历其行,如果我将每个代码更改为使用apply(grid, MARGIN=2, ...),我也会“优化”您正在查看的代码p-valueall(p.vals < .05)

lambdas <- expand.grid(1:3,1:3,1:3) 
check_lambdas <- function(lambdas){
    f <-try(rqss(Y~qss(X1,lambda = lambdas[1])+qss(X2,lambda = lambdas[2])+qss(X3,lambda = lambdas[3]), tau=0.05)) 
    if( all(summary(f)$qsstab[,'Pr(>F)']<0.05) ) f$lambdas else NULL
}
apply(lambdas, 2, check_lambdas)
于 2020-12-28T00:47:15.770 回答