繁体   English   中英

存在权重时,glmnet如何标准化变量?

[英]How does glmnet standardize variables when weights are present?

glmnet允许用户通过weights参数输入观察权重的向量。 glmnet还标准化(默认情况下)预测变量的均值和单位方差为零。 我的问题是:提供weights ,glmnet会使用每列的加权平均值(和标准差)还是未加权平均值(和标准差)对预测变量进行标准化吗?

Link上glmnet的标准化描述

在帖子中,您可以看到glmnet的用于计算标准化的源代码的Fortran代码片段。 (“证明”段落,第二个项目符号)。

我对Fortran不熟悉,但是对我来说,它看起来非常像实际上是在使用加权均值和sd。

编辑:从glmnet小插图:

weights是观察值的权重。每个观察值的默认值为1。(注意:glmnet将权重重新缩放为总和N,即样本大小。)”

由于Fortran代码中的w是重新缩放的权重,因此这似乎与加权平均标准化一致。

就其价值而言,与公认的答案一致, glmnet中的权重是采样权重,而不是方差逆权重。 例如,如果您拥有比唯一观测值更多的观测值,则可以压缩数据集并获得相同的系数估计值:

n <- 50
m <- 5

y_norm <- rnorm(n)
y_bool <- rbinom(n,1,.5)
x <- matrix(rnorm(n*m),n)
w <- rpois(n,3) + 1 # weights
w_indx <- rep(1:n,times=w) # weights index

m1 = glmnet(x, y_norm, weights = w)
m2 = glmnet(x[w_indx,] ,y_norm[w_indx])
all.equal(coef(m1,s=.1),
          coef(m2,s=.1))
>>> TRUE

M1 = glmnet(x,y_bool,weights = w,family = "binomial")
M2 = glmnet(x[w_indx,],y_bool[w_indx],family = "binomial")
all.equal(coef(M1,s=.1),
          coef(M2,s=.1))
>>> TRUE

当然,将权重与cv.glmnet一起使用时需要格外小心,因为聚合记录的权重应该使用多项式分布分布在各个折点上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM