glmnet的standardize参数如何处理虚拟变量?

Dr.*_*rox 14 r machine-learning dataset glmnet

在我的数据集中,我有许多连续和虚拟变量.对于使用glmnet进行分析,我希望连续变量是标准化的,而不是虚拟变量.

我目前通过首先定义仅具有[0,1]值的列的虚拟向量然后scale在所有非虚拟列上使用该命令来手动执行此操作.问题是,这不是很优雅.

但是glmnet有一个内置的standardize论点.默认情况下这会使假人标准化吗?如果是这样,有没有一种优雅的方式来告诉glmnet的standardize论点跳过假人?

R_U*_*ser 12

简而言之,是的 - 这将标准化虚拟变量,但这样做是有原因的.该glmnet函数将矩阵作为其X参数的输入,而不是数据框,因此factor如果参数为a ,则不会对您可能具有的列进行区分data.frame.如果你看一下R函数,glmnet会在standardize内部对参数进行编码

    isd = as.integer(standardize)
Run Code Online (Sandbox Code Playgroud)

它将R boolean转换为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
Run Code Online (Sandbox Code Playgroud)

看看标记为1000的线 - 这基本上是将标准化公式应用于X矩阵.

从统计学上讲,人们通常不会对分类变量进行标准化,以保留估计回归量的可解释性.然而,正如Tibshirani 在此指出的那样,"套索方法需要对回归量进行初始标准化,因此惩罚方案对所有回归量都是公平的.对于分类回归量,人们用虚拟变量对回归量进行编码,然后对虚拟变量进行标准化" -因此,虽然这导致连续变量和分类变量之间的任意缩放,但它是为了同等的惩罚处理.

  • 我做了一些[类似的挖掘](https://thinklab.com/discussion/computing-standardized-logistic-regression-coefficients/205#5)来确认glmnet在拟合标准化变量后重新转换系数的方式.Funtran :-) (2认同)