Ошибка при использовании функции адаптивного лассо с загрузкой - PullRequest
1 голос
/ 07 февраля 2020

В настоящее время у меня есть код ниже. Функция работает при запуске вне функции boot (), но при использовании функции boot () выдает ошибку

Ошибка в t.star [r,] <- res [[r ]]: количество заменяемых элементов не кратно длине замены. </p>

Когда я использую функцию boot (), более низкие значения R позволяют функции работать правильно. Что-то, что мне нужно добавить в мою функцию, чтобы я не продолжал получать эту ошибку?


    alassoOLS_ydot_n10_fn <- function(data,index){ #index is the bootstrap sample index
      x <- data[index,-1]
      y <- data[index,1]
      cv.out <- cv.glmnet(x,y,alpha=1,nfolds=10, penalty.factor = 1 / abs(best_ridge_coef.ydot.n10)) #alpha=1, lasso
      bestlam <- cv.out$lambda.min #the best lambda chosen by CV
      lasso.mod <- glmnet(x,y,alpha=1,lambda=bestlam, penalty.factor = 1 / abs(best_ridge_coef.ydot.n10))
      coef <- as.vector(coef(lasso.mod))[-1]
      coef_nonzero <- coef != 0
      ls.obj <- lm(y ~x[, coef_nonzero, drop = FALSE])
      ls_coef <- (ls.obj$coefficients)[-1]
      return(ls_coef)
    }

boot(ydot_matrix_n10,alassoOLS_ydot_n10_fn,R=500)

1 Ответ

1 голос
/ 07 февраля 2020

Длина вектора, возвращаемого alassoOLS_ydot_n10_fn, не является постоянной, а зависит от количества переменных, выбранных glmnet.
Я изменил вашу функцию следующим образом:

alassoOLS_ydot_n10_fn <- function(data,index){ 
  x <- data[index,-1]
  y <- data[index,1]
  cv.out <- cv.glmnet(x,y,alpha=1,nfolds=10) 
  bestlam <- cv.out$lambda.min #the best lambda chosen by CV
  lasso.mod <- glmnet(x,y,alpha=1,lambda=bestlam, penalty.factor = 1/abs(best_ridge_coef.ydot.n10))
  coef <- as.vector(coef(lasso.mod))[-1]
  coef_nonzero <- coef != 0
  ls.obj <- lm(y ~x[, coef_nonzero, drop = FALSE])
  ls_coef <- (ls.obj$coefficients)[-1]
  # Generate a fixed-length vector fo OLS coefficients
  # The coefficients of variables not selected by glmnet were set to zero.
  vect_coef <- rep(0,length(coef_nonzero))
  vect_coef[coef_nonzero] <- ls_coef
  return(vect_coef)
}

Теперь output представляет собой вектор коэффициентов фиксированной длины.
Я установил в 0 коэффициенты ковариат, не выбранных с помощью gl mnet.
(я не знаю, является ли это правильным со статистической точки зрения в Ваше расследование.
Моя цель - только показать источник сообщения об ошибке, выданного boot.)
Теперь boot работает без ошибок. См. Следующий пример.

set.seed(1)
ydot_matrix_n10 <- matrix(runif(1000), ncol=10)
best_ridge_coef.ydot.n10 <- 10
boot(ydot_matrix_n10,alassoOLS_ydot_n10_fn,R=50)

Результат представлен ниже.

ORDINARY NONPARAMETRIC BOOTSTRAP

Bootstrap Statistics :
       original       bias    std. error
t1*  0.00000000 -0.002330197  0.02319543
t2*  0.13530886 -0.001906712  0.09889174
t3* -0.19509877 -0.013020365  0.07251921
t4* -0.01954785  0.015227018  0.09184750
t5*  0.05600451  0.008896392  0.08729263
t6*  0.12978757 -0.013795860  0.11320119
t7*  0.06525111 -0.007208380  0.09703813
t8*  0.09368079 -0.017343037  0.08947958
t9* -0.09518469 -0.003352512  0.08575450
...