Как glmnet стандартизировать аргумент обрабатывать фиктивные переменные?

В моем наборе данных у меня есть ряд непрерывных и фиктивных переменных. Для анализа с помощью glmnet я хочу, чтобы непрерывные переменные были стандартизированы, но не фиктивные переменные.

В настоящее время я делаю это вручную, сначала определяя фиктивный вектор столбцов, который имеет только значения [0,1], а затем использует команду scale для всех непустых столбцов. Проблема в том, что это не очень элегантно.

Но glmnet имеет встроенный аргумент standardize. По умолчанию это также стандартизирует манекены? Если да, то есть ли элегантный способ сообщить аргументу glmnet standardize пропустить макеты?

Ответ 1

Короче говоря, да - это будет стандартизировать фиктивные переменные, но есть причина для этого. Функция glmnet принимает матрицу как вход для своего параметра X, а не фрейма данных, поэтому она не делает различия для столбцов factor, которые могут возникнуть, если параметр был data.frame. Если вы посмотрите на функцию R, glmnet кодирует параметр standardize внутренне как

    isd = as.integer(standardize)

Что преобразует R булево значение в 0 или 1 целое число для подачи на любую из внутренних функций FORTRAN (elnet, lognet и др.)

Если вы пойдете еще дальше, изучив код FORTRAN (фиксированная ширина - старая школа!), вы увидите следующий блок:

          subroutine standard1 (no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr)    989
          real x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni)                        989
          integer ju(ni)                                                        990
          real, dimension (:), allocatable :: v                                     
          allocate(v(1:no),stat=jerr)                                           993
          if(jerr.ne.0) return                                                  994
          w=w/sum(w)                                                            994
          v=sqrt(w)                                                             995
          if(intr .ne. 0)goto 10651                                             995
          ym=0.0                                                                995
          y=v*y                                                                 996
          ys=sqrt(dot_product(y,y)-dot_product(v,y)**2)                         996
          y=y/ys                                                                997
    10660 do 10661 j=1,ni                                                       997
          if(ju(j).eq.0)goto 10661                                              997
          xm(j)=0.0                                                             997
          x(:,j)=v*x(:,j)                                                       998
          xv(j)=dot_product(x(:,j),x(:,j))                                      999
          if(isd .eq. 0)goto 10681                                              999
          xbq=dot_product(v,x(:,j))**2                                          999
          vc=xv(j)-xbq                                                         1000
          xs(j)=sqrt(vc)                                                       1000
          x(:,j)=x(:,j)/xs(j)                                                  1000
          xv(j)=1.0+xbq/vc                                                     1001
          goto 10691                                                           1002

Взгляните на строки с надписью 1000 - это в основном применение формулы стандартизации к матрице X.

В настоящее время статистически, обычно не стандартизируются категориальные переменные, чтобы сохранить интерпретируемость оцененных регрессоров. Однако, как отметил Тибширани здесь, "Метод лассо требует первоначальной стандартизации регрессоров, так что схема наказания справедлива для всех регрессоров. Для категориальных регрессоров один кодирует регрессор с фиктивными переменными, а затем стандартизирует фиктивные переменные" - так что, хотя это вызывает произвольное масштабирование между непрерывными и категориальными переменными, это делается для равного наказания.

Ответ 2

glmnet ничего не знает о фиктивных переменных, поскольку он не имеет интерфейса формулы (и, следовательно, не касается model.frame и model.matrix.) Если вы хотите, чтобы с ними обращались специально, вы придется делать это самостоятельно.