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

时间:2016-12-13 13:50:43

标签: r machine-learning glmnet

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

2 个答案:

答案 0 :(得分:2)

Link

上有glmnet标准化的说明

在帖子中,您可以看到glmnet来源的Fortran-Code-Snippet计算标准化。 (“证据”一节,第二个子弹)。

我对Fortran并不熟悉,但对我而言,它看起来非常像实际使用加权意思和sd。

编辑:来自glmnet插图:

  

weights用于观察权重。默认值为1   观察。 (注意:glmnet重新调整权重总和为N,即   样本量。)“

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

答案 1 :(得分:2)

对于它的价值,与接受的答案一致,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权重时需要多加注意,因为聚合记录的权重应使用多项分布在折叠中展开...