2016-12-13 11 views
0

glmnetを使用すると、ユーザはweights引数を使用して観測加重ベクトルを入力できます。また、glmnetは、平均値と単位分散がゼロになるように(デフォルトで)プレディクタ変数を標準化しています。私の質問は、weightsが提供されている場合、glmnetは各列の加重平均(および標準偏差)または加重平均(および標準偏差)を使用して予測子を標準化していますか?重量が存在する場合、glmnetはどのように変数を標準化しますか?

答えて

2

標準化を計算のソース「あなたはglmnetのFortranの-CODE-スニペットを見ることができますLink

ポストで

での標準化」glmnetの説明があります。 (「証明」段落、第2の箇条書き)。

私はFortranに精通していませんが、実際には重み付け平均とsdを使用しているように見えます。

編集:glmnetビネットから:

"weightsが観測重みのためのものであるデフォルトでは、各 観察のために1である(注:glmnetはN、 サンプルサイズに合計する重みを再スケール。 w付き)」

Fortranコードを再スケーリングの重みであることで、これは加重平均の標準化と一致しているようです。

1

受け入れられた答えと一致して、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を使用します。

関連する問題