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