gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:22:31 29 4
gpt4 key购买 nike

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

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

但是 glmnet 有一个内置的标准化参数。默认情况下,这也会标准化假人吗?如果是这样,是否有一种优雅的方法来告诉 glmnet 的 standardize 参数跳过傻瓜?

最佳答案

简而言之,是的 - 这将使虚拟变量标准化,但这样做是有原因的。 glmnet 函数采用矩阵作为其 X 参数的输入,而不是数据框,因此它不会区分 factor如果参数是 data.frame,您可能拥有的列。如果您查看 R 函数,glmnet 在内部将 standardize 参数编码为

    isd = as.integer(standardize)

它将 R bool 值转换为 0 或 1 整数,以提供给任何内部 FORTRAN 函数(elnet、lognet 等)

如果您进一步检查 FORTRAN 代码(固定宽度 - 老派!),您将看到以下 block :

          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 here 所指出的那样,“套索方法需要对回归量进行初始标准化,以便惩罚方案对所有回归量都是公平的。对于分类回归量,用虚拟变量对回归量进行编码,然后对虚拟变量进行标准化” - 因此,虽然这会导致连续之间的任意缩放和分类变量,这是为了平等惩罚待遇。

关于r - glmnet 的标准化参数如何处理虚拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17887747/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com