glmnet的标准化参数如何处理虚拟变量?

16

在我的数据集中,我有一些连续变量和虚拟变量。为了使用glmnet进行分析,我希望对连续变量进行标准化,但不对虚拟变量进行标准化。

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

但是glmnet有一个内置的standardize参数。默认情况下,它会标准化虚拟变量吗?如果是这样,是否有一种优雅的方法告诉glmnet的standardize参数跳过虚拟变量?


你为什么要做那么多额外的工作呢? - IRTFM
@DWin 我看不到其他的方法。如果glmnet不能区分,那么我需要区分。正如我刚才在下面发布的,如果我们无法解释标准化虚拟变量上的系数,则我需要在标准化之前将虚拟变量与非虚拟变量分开。 - Dr. Beeblebrox
2个回答

13

简而言之,是的 - 这将标准化虚拟变量,但这么做有原因。 glmnet 函数将矩阵作为其 X 参数的输入,而不是数据框,因此它不会对您可能拥有的 data.frame 参数的 factor 列进行区分。如果您查看 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矩阵。

从统计学角度来看,人们通常不会对分类变量进行标准化以保留估计回归系数的可��释性。然而,正如Tibshirani在这里指出的那样,“套索法要求对回归器进行初始标准化,使惩罚方案对所有回归器都公平。对于分类回归器,可以使用虚拟变量对回归器进行编码,然后对虚拟变量进行标准化”——因此,虽然这会导致连续和分类变量之间的任意缩放,但是这是为了实现平等的惩罚处理。


2
我做了一些 类似的挖掘 来确认 glmnet 在拟合标准化变量后重新转换系数的方式。很有趣 :-) - Antoine Lizée
glmnet的帮助文档中可以得知:"系数总是以原始比例返回"。因此,系数的可解释性不应该成为一个问题。 - pbahr
虽然系数是“在原始比例尺上”,但L1和L2惩罚本质上会使回归器系数有偏向性,试图减少方差(参见偏差-方差权衡),这意味着它们不应被视为对因变量值影响的无偏估计。只是澄清一下 :) - R_User

3

glmnet不知道关于虚拟变量的任何信息,因为它没有公式接口(因此不会涉及model.framemodel.matrix)。如果您想让它们被特别处理,您需要自己处理。


让虚拟变量标准化是否可行? - Dr. Beeblebrox
2
回答我自己的问题,不可以将虚拟变量标准化。引用http://www.sagepub.com/upm-data/21120_Chapter_7.pdf第140页的话:“虚拟回归系数的非标准化系数可解释为特定类别与虚拟回归器集合的基线类别之间的预期响应变量差异(当然,要控制模型中的其他解释变量)。如果虚拟回归系数被标准化,则会失去这种直接的解释。” - Dr. Beeblebrox
@R_User,您是否想根据您的评论添加答案?那么我可以接受您的回答。 - Dr. Beeblebrox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接