L'interprétation des probabilités des expressions fréquentistes de vraisemblance, les valeurs de p, etc. pour un modèle LASSO et la régression pas à pas ne sont pas correctes.
Ces expressions surestiment la probabilité. Par exemple, un intervalle de confiance à 95% pour un paramètre est censé dire que vous avez une probabilité de 95% que la méthode aboutisse à un intervalle avec la vraie variable de modèle à l'intérieur de cet intervalle.
Cependant, les modèles ajustés ne résultent pas d'une seule hypothèse typique, et au lieu de cela, nous sélectionnons les cerises (sélectionnez parmi de nombreux modèles alternatifs possibles) lorsque nous effectuons une régression pas à pas ou une régression LASSO.
Il est peu logique d'évaluer l'exactitude des paramètres du modèle (en particulier lorsqu'il est probable que le modèle n'est pas correct).
Dans l'exemple ci-dessous, expliqué plus loin, le modèle est adapté à de nombreux régresseurs et il «souffre» de la multicolinéarité. Il est donc probable qu'un régresseur voisin (qui est fortement corrélé) soit sélectionné dans le modèle au lieu de celui qui est réellement dans le modèle. La forte corrélation fait que les coefficients ont une grande erreur / variance (relative à la matrice ( XTX)- 1 ).
Cependant, cette variance élevée due à la multicolionarité n'est pas `` vue '' dans les diagnostics comme les valeurs p ou l'erreur standard des coefficients, car ceux-ci sont basés sur une matrice de conception X plus petite avec moins de régresseurs. (et il n'y a pas de méthode simple pour calculer ce type de statistiques pour LASSO)
Exemple: le graphique ci-dessous qui affiche les résultats d'un modèle de jouet pour un signal qui est une somme linéaire de 10 courbes gaussiennes (cela peut par exemple ressembler à une analyse en chimie où un signal pour un spectre est considéré comme une somme linéaire de plusieurs composants). Le signal des 10 courbes est équipé d'un modèle de 100 composantes (courbes gaussiennes de moyenne différente) utilisant LASSO. Le signal est bien estimé (comparer les courbes rouge et noire qui sont raisonnablement proches). Mais, les coefficients sous-jacents réels ne sont pas bien estimés et peuvent être complètement faux (comparer les barres rouges et noires avec des points qui ne sont pas les mêmes). Voir aussi les 10 derniers coefficients:
91 91 92 93 94 95 96 97 98 99 100
true model 0 0 0 0 0 0 0 142.8 0 0 0
fitted 0 0 0 0 0 0 129.7 6.9 0 0 0
Le modèle LASSO sélectionne des coefficients qui sont très approximatifs, mais du point de vue des coefficients eux-mêmes, cela signifie une grande erreur lorsqu'un coefficient qui devrait être non nul est estimé à zéro et un coefficient voisin qui devrait être nul est estimé à être non nul. Tout intervalle de confiance pour les coefficients n'aurait que très peu de sens.
Raccord LASSO
Ajustement pas à pas
A titre de comparaison, la même courbe peut être équipée d'un algorithme pas à pas conduisant à l'image ci-dessous. (avec des problèmes similaires, les coefficients sont proches mais ne correspondent pas)
Même lorsque vous considérez la précision de la courbe (plutôt que les paramètres, qui, au point précédent, est clair que cela n'a aucun sens), vous devez faire face au sur-ajustement. Lorsque vous effectuez une procédure d'ajustement avec LASSO, vous utilisez des données de formation (pour ajuster les modèles avec différents paramètres) et des données de test / validation (pour régler / trouver le meilleur paramètre), mais vous devez également utiliser un troisième ensemble séparé des données de test / validation pour connaître les performances des données.
Une valeur de p ou quelque chose de simulaire ne fonctionnera pas parce que vous travaillez sur un modèle réglé qui est la cueillette des cerises et différent (degrés de liberté beaucoup plus grands) de la méthode d'ajustement linéaire régulière.
souffrir des mêmes problèmes que la régression pas à pas?
R2
Je pensais que la principale raison d'utiliser LASSO au lieu d'une régression pas à pas est que LASSO permet une sélection de paramètres moins gourmande, moins influencée par la multicollinarité. (plus de différences entre LASSO et pas à pas: Supériorité de LASSO sur la sélection avant / élimination arrière en termes d'erreur de prédiction de validation croisée du modèle )
Code pour l'exemple d'image
# settings
library(glmnet)
n <- 10^2 # number of regressors/vectors
m <- 2 # multiplier for number of datapoints
nel <- 10 # number of elements in the model
set.seed(1)
sig <- 4
t <- seq(0,n,length.out=m*n)
# vectors
X <- sapply(1:n, FUN <- function(x) dnorm(t,x,sig))
# some random function with nel elements, with Poisson noise added
par <- sample(1:n,nel)
coef <- rep(0,n)
coef[par] <- rnorm(nel,10,5)^2
Y <- rpois(n*m,X %*% coef)
# LASSO cross validation
fit <- cv.glmnet(X,Y, lower.limits=0, intercept=FALSE,
alpha=1, nfolds=5, lambda=exp(seq(-4,4,0.1)))
plot(fit$lambda, fit$cvm,log="xy")
plot(fit)
Yfit <- (X %*% coef(fit)[-1])
# non negative least squares
# (uses a stepwise algorithm or should be equivalent to stepwise)
fit2<-nnls(X,Y)
# plotting
par(mgp=c(0.3,0.0,0), mar=c(2,4.1,0.2,2.1))
layout(matrix(1:2,2),heights=c(1,0.55))
plot(t,Y,pch=21,col=rgb(0,0,0,0.3),bg=rgb(0,0,0,0.3),cex=0.7,
xaxt = "n", yaxt = "n",
ylab="", xlab = "",bty="n")
#lines(t,Yfit,col=2,lwd=2) # fitted mean
lines(t,X %*% coef,lwd=2) # true mean
lines(t,X %*% coef(fit2), col=3,lwd=2) # 2nd fit
# add coefficients in the plot
for (i in 1:n) {
if (coef[i] > 0) {
lines(c(i,i),c(0,coef[i])*dnorm(0,0,sig))
points(i,coef[i]*dnorm(0,0,sig), pch=21, col=1,bg="white",cex=1)
}
if (coef(fit)[i+1] > 0) {
# lines(c(i,i),c(0,coef(fit)[i+1])*dnorm(0,0,sig),col=2)
# points(i,coef(fit)[i+1]*dnorm(0,0,sig), pch=21, col=2,bg="white",cex=1)
}
if (coef(fit2)[i+1] > 0) {
lines(c(i,i),c(0,coef(fit2)[i+1])*dnorm(0,0,sig),col=3)
points(i,coef(fit2)[i+1]*dnorm(0,0,sig), pch=21, col=3,bg="white",cex=1)
}
}
#Arrows(85,23,85-6,23+10,-0.2,col=1,cex=0.5,arr.length=0.1)
#Arrows(86.5,33,86.5-6,33+10,-0.2,col=2,cex=0.5,arr.length=0.1)
#text(85-6,23+10,"true coefficient", pos=2, cex=0.7,col=1)
#text(86.5-6,33+10, "fitted coefficient", pos=2, cex=0.7,col=2)
text(0,50, "signal versus position\n true mean (black), fitted with nnls (green)", cex=1,col=1,pos=4, font=2)
plot(-100,-100,pch=21,col=1,bg="white",cex=0.7,type="l",lwd=2,
xaxt = "n", yaxt = "n",
ylab="", xlab = "",
ylim=c(0,max(coef(fit)))*dnorm(0,0,sig),xlim=c(0,n),bty="n")
#lines(t,X %*% coef,lwd=2,col=2)
for (i in 1:n) {
if (coef[i] > 0) {
lines(t,X[,i]*coef[i],lty=1)
}
if (coef(fit)[i+1] > 0) {
# lines(t,X[,i]*coef(fit)[i+1],col=2,lty=1)
}
if (coef(fit2)[i+1] > 0) {
lines(t,X[,i]*coef(fit2)[i+1],col=3,lty=1)
}
}
text(0,33, "illustration of seperate components/curves", cex=1,col=1,pos=4, font=2)