2016-07-14 10 views
8

LASSOはOLS適合と同じ(または非常に似た)係数見積もりをもたらすためにペナルティなし($ \ lambda = 0 $) OLSは、フィットのためしかし、ノーペナルティとLASSOフィット用

  • glmnet(x, y , alpha=1, lambda=0)
  • lm(y ~ x)に同じデータ(x、y)を入れR内の異なる係数の推定値を得ます。

なぜですか?

+3

Rの特定の機能に焦点を当てるのではなく、2つのフィットが非常に似ていると思われる理由を説明する方が良いでしょう。例えば。ペナルティなしのLASSOは、それがあなたが意味するものであれば、OLS適合に他の何も与えてはいけないと言います。数式を使って考える理由を詳しく説明することもできます。 –

+0

私は、ペナルティなしのLASSOはかなり明らかだと思って、OLSは同じ結果を出すべきです。なぜ2つのアルゴリズムが私に異なる見積もりを与えるのか不思議でした。 –

+0

他の人にとっては明白ではないかもしれないことは明白です。そうであれば、可能な限り明示的で正確なことが最良の場合に備えてください。 –

答えて

0

glmnet help:glmnetは、 のラムダシーケンスを計算する前に、yが単位分散を持つように標準化しています(結果として得られる係数を標準化しています)。 duce /他のソフトウェアと結果を比較する場合は、標準化されたyを提供することをお勧めします。

+0

lmとglmnetの係数の差は、係数の絶対値が小さくなるにつれて小さくなります。係数を標準化しても、私はまだ同じ違いがあります。 –

+1

ヘルプファイルには、特にラムダパラメータの説明があり、ベクトルではなくスカラのみを提供する場合にはアルゴリズムに問題がある可能性があるという警告があります。私はこれがスピードの問題を引き起こすか、実際に見積もりを偏らせるかどうかはわかりません。 – tomka

1

私はHastieの本の「前立腺」の例データセットの次のコードを実行した:

out.lin1 = lm(lpsa ~ . , data=yy) 
out.lin1$coeff    
out.lin2 = glmnet(as.matrix(yy[ , -9]), yy$lpsa, family="gaussian", lambda=0, standardize=T ) 
coefficients(out.lin2) 

と係数の結果は似ています。標準化オプションを使用すると、glmnet()による返された係数は入力変数の元の単位になります。 「ガウス」ファミリーを使用していることを確認してください。

+0

family = "gaussian"を追加しても結果は変わりません –

+0

Rコードとデータ操作を含めることができますか? –

3

機能が間違っています。 xはモデル行列でなければなりません。未処理のプレディクタ値ではありません。あなたがそうすると、全く同じ結果が得られます:

x <- rnorm(500) 
y <- rnorm(500) 
mod1 <- lm(y ~ x) 

xmm <- model.matrix(mod1) 
mod2 <- glmnet(xmm, y, alpha=1, lambda=0) 

coef(mod1) 
coef(mod2) 
0

私は同じ問題を抱えています。私は、glmnetは非定常シリーズ、すなわちシリーズが統合されているように見えるときやランダムな歩行を扱うことができないと思う。固定データをシミュレートすると、glmnetとOLSの結果は十分に近いです。しかし、理論的には、lambda = 0のglmnetは、シリーズが統合されているかどうかにかかわらず、OLSと同じ結果をもたらすはずです。

以下のコードでは、1990年から1999年までのカリフォルニア州の郡別失業期間を短縮してBureau of Labor Statistics Local Area databaseから計算しています。便宜上、そのデータのCSVコピーをhereに配置しました。このコードは、他のすべての郡の過去の値について1つの郡の値を回帰します。 #30,34、および36郡(オレンジ郡、サクラメント郡、サンバーナーディーノ郡)の失業の軌道は統合されているように見えます。 OLSは、自己回帰係数、すなわち左側の郡の過去の値に対応する回帰係数を1より小さくする。しかし、glmnetは1より大きい値を返す.1を超える自己回帰係数は、爆発的な道。このコードでは、family、standardization、weights、およびinterceptのデフォルト値が記載されています。また、デフォルトよりもはるかに厳しいコンバージェンス基準を設定します。

このコードを郡#30(オレンジ郡)で実行すると、0.9のOLS係数と1.2のLASSO係数が得られます。 not_bonferroniによる提案は、全く同じ結果をもたらします(観察よりも回帰の多いBig Kの問題には適用されません)。

county_wide <- read.csv(file = "county_wide.csv") 

# Problematic counties: #30, #34, #36 
# All three look like their path is integrated rather than stationary 
selected_county <- 30 

# Get dimensions 
num_entities <- dim(county_wide)[2] 
num_observations <- dim(county_wide)[1] 

# Dependent variable: most recent observations of selected county 
Y <- as.matrix(county_wide[1:(num_observations - 1), selected_county]) 

# Independent variables: lagged observations of all counties 
X <- as.matrix(county_wide[2:num_observations, ]) 

# Plot the county to show that it is integrated 
plot(county_wide[, selected_county]) 

# Run OLS, which adds an intercept by default 
ols <- lm(Y ~ X) 
ols_coef <- coef(ols) 

# Control glmnet settings 
glmnet.control(factory = T) 
glmnet.control(fdev = 1e-20) 
glmnet.control(devmax = 0.99999999999999999) 

# run glmnet with lambda = 0 and spelling out the 
# default values for arguments, e.g. intercept 
library("glmnet") 
lasso0 <- glmnet(y = Y, 
       x = X, 
       intercept = T, 
       lambda = 0, 
       weights = rep(1, times = num_observations - 1), 
       alpha = 1, 
       standardize = T, 
       family = "gaussian") 
lasso_coef <- coef(lasso0) 

# compare OLS and LASSO 
comparison <- data.frame(ols = ols_coef, 
         lasso = lasso_coef[1:length(lasso_coef)] 
) 
comparison$difference <- comparison$ols - comparison$lasso 

# Show average difference 
mean(comparison$difference) 

# Show the two values for the autoregressive parameter 
comparison[1 + selected_county, ] 

# Note how different these are: glmnet returns a coefficient above 1, ols returns 
# a coefficient below 1!! 


# not_bonferroni's suggested solution returns exactly the same 
# results with these data 
mod1 <- lm(Y ~ X) 

xmm <- model.matrix(mod1) 
mod2 <- glmnet(xmm, Y, alpha = 1, lambda = 0, intercept = T) 

coef(mod1)[selected_county + 1] # Index +1 for the intercept 
coef(mod2)[selected_county + 2] # Index +2 for the intercepts of OLS and LASSO 
関連する問題