관찰하는 차이는 GLMNET이 목적 함수에서 사용하는 관측치 수 N의 추가 분할과 아래에 표시된 샘플 표준 편차에 의한 Y의 암시 적 표준화로 인한 것입니다.
12N∥∥∥ysy−Xβ∥∥∥22+λ∥β∥22/2
우리가 사용하는 곳 대신에, 에 대한 ,
1/n1/(n−1)sy
sy=∑i(yi−y¯)2n
베타에 대해 미분하고 방정식을 0으로 설정하면
XTXβ−XTysy+Nλβ=0
베타를 해결하면 추정치를 얻습니다.
β~GLMNET=(XTX+NλIp)−1XTysy
Y의 원래 측정 항목에 대한 추정치 (및 해당 처벌)를 복구하기 위해 GLMNET은 추정치와 람다에 결과를 사용자에게 반환합니다.sy
β^GLMNET=syβ~GLMNET=(XTX+NλIp)−1XTy
λunstd.=syλ
이 솔루션을 표준 능형 회귀 분석과 비교하십시오.
β^=(XTX+λIp)−1XTy
것을 알 수 우리가 사용하는 경우, 또한 N의 추가 요인에 의해 조정됩니다 또는 기능, 페널티 암시 적으로 확장 할 것입니다 . 즉,이 함수를 사용하여 일부 대한 계수 추정치를 얻으면 대한 추정치를 효과적으로 얻는 입니다.λpredict()
coef()
1/syλ∗λ=λ∗/sy
이러한 관찰에 기초하여 GLMNET에 사용 된 페널티는 계수로 조정되어야합니다 .sy/N
set.seed(123)
n <- 1000
p <- 100
X <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
sd_y <- sqrt(var(Y)*(n-1)/n)[1,1]
beta1 <- solve(t(X)%*%X+10*diag(p),t(X)%*%(Y))[,1]
fit_glmnet <- glmnet(X,Y, alpha=0, standardize = F, intercept = FALSE, thresh = 1e-20)
beta2 <- as.vector(coef(fit_glmnet, s = sd_y*10/n, exact = TRUE))[-1]
cbind(beta1[1:10], beta2[1:10])
[,1] [,2]
[1,] 0.23793862 0.23793862
[2,] 1.81859695 1.81859695
[3,] -0.06000195 -0.06000195
[4,] -0.04958695 -0.04958695
[5,] 0.41870613 0.41870613
[6,] 1.30244151 1.30244151
[7,] 0.06566168 0.06566168
[8,] 0.44634038 0.44634038
[9,] 0.86477108 0.86477108
[10,] -2.47535340 -2.47535340
결과는 절편 및 표준화 된 X 변수의 포함으로 일반화됩니다. 표준화 된 X 행렬을 1의 열과 대각선 행렬을 포함하도록 수정하여 [1,1] 위치에 추가 영점을 갖습니다 (즉, 절편에 불이익을주지 않음). 그런 다음 각각의 표본 표준 편차를 기준으로 추정값을 표준화 해제 할 수 있습니다 (표준 편차를 계산할 때 1 / n을 사용하는지 확인).
β^j=βj~sxj
β^0=β0~−x¯Tβ^
mean_x <- colMeans(X)
sd_x <- sqrt(apply(X,2,var)*(n-1)/n)
X_scaled <- matrix(NA, nrow = n, ncol = p)
for(i in 1:p){
X_scaled[,i] <- (X[,i] - mean_x[i])/sd_x[i]
}
X_scaled_ones <- cbind(rep(1,n), X_scaled)
beta3 <- solve(t(X_scaled_ones)%*%X_scaled_ones+1000*diag(x = c(0, rep(1,p))),t(X_scaled_ones)%*%(Y))[,1]
beta3 <- c(beta3[1] - crossprod(mean_x,beta3[-1]/sd_x), beta3[-1]/sd_x)
fit_glmnet2 <- glmnet(X,Y, alpha=0, thresh = 1e-20)
beta4 <- as.vector(coef(fit_glmnet2, s = sd_y*1000/n, exact = TRUE))
cbind(beta3[1:10], beta4[1:10])
[,1] [,2]
[1,] 0.24534485 0.24534485
[2,] 0.17661130 0.17661130
[3,] 0.86993230 0.86993230
[4,] -0.12449217 -0.12449217
[5,] -0.06410361 -0.06410361
[6,] 0.17568987 0.17568987
[7,] 0.59773230 0.59773230
[8,] 0.06594704 0.06594704
[9,] 0.22860655 0.22860655
[10,] 0.33254206 0.33254206
인터셉트없이 표준화 된 X를 표시하는 코드가 추가되었습니다.
set.seed(123)
n <- 1000
p <- 100
X <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
sd_y <- sqrt(var(Y)*(n-1)/n)[1,1]
mean_x <- colMeans(X)
sd_x <- sqrt(apply(X,2,var)*(n-1)/n)
X_scaled <- matrix(NA, nrow = n, ncol = p)
for(i in 1:p){
X_scaled[,i] <- (X[,i] - mean_x[i])/sd_x[i]
}
beta1 <- solve(t(X_scaled)%*%X_scaled+10*diag(p),t(X_scaled)%*%(Y))[,1]
fit_glmnet <- glmnet(X_scaled,Y, alpha=0, standardize = F, intercept =
FALSE, thresh = 1e-20)
beta2 <- as.vector(coef(fit_glmnet, s = sd_y*10/n, exact = TRUE))[-1]
cbind(beta1[1:10], beta2[1:10])
[,1] [,2]
[1,] 0.23560948 0.23560948
[2,] 1.83469846 1.83469846
[3,] -0.05827086 -0.05827086
[4,] -0.04927314 -0.04927314
[5,] 0.41871870 0.41871870
[6,] 1.28969361 1.28969361
[7,] 0.06552927 0.06552927
[8,] 0.44576008 0.44576008
[9,] 0.90156795 0.90156795
[10,] -2.43163420 -2.43163420