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

问题描述 投票:0回答:2

glmnet 允许用户通过

weights
参数输入观测权重向量。 glmnet 还标准化(默认情况下)预测变量以具有零均值和单位方差。我的问题是:当提供
weights
时,glmnet 是否使用每列的加权平均值(和标准差)或未加权平均值(和标准差)来标准化预测变量?

r machine-learning glmnet
2个回答
2
投票

Link
有关于glmnet

标准化的描述

在帖子中,您可以看到

glmnet
计算标准化的源代码的 Fortran 代码片段。 (“证明”段落,第二个项目符号)。

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

编辑:来自 glmnet 小插图:

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

Fortran 代码中的

w
是重新调整的权重,这似乎与 加权平均标准化一致。


2
投票

就其价值而言,与公认的答案一致,

glmnet
中的权重是采样权重,而不是逆方差权重。例如,如果您的观测值比unique观测值多得多,您可以压缩数据集并获得相同的系数估计值:

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 中使用权重时需要更加小心,因为聚合记录的权重应使用多项分布分布在折叠中......

© www.soinside.com 2019 - 2024. All rights reserved.