Інтерпретація ймовірності частолістських виразів вірогідності, p-значень etcetera для моделі LASSO та ступінчастої регресії не є правильною.
Ці вирази завищують ймовірність. Наприклад, 95% довірчий інтервал для деякого параметра повинен означати, що ви маєте 95% ймовірність того, що метод призведе до інтервалу з істинною змінною моделі всередині цього інтервалу.
Однак пристосовані моделі не є результатом типової єдиної гіпотези, і натомість ми проводимо вибір вишні (вибираємо з багатьох можливих альтернативних моделей), коли ми робимо ступінчату регресію або регресію LASSO.
Мало сенсу оцінювати правильність параметрів моделі (особливо, якщо є ймовірність, що модель неправильна).
У наведеному нижче прикладі, поясненому пізніше, модель підходить для багатьох регресорів і «страждає» від мультиколінеарності. Це робить імовірним, що сусідній регресор (який сильно корелює) обраний у моделі замість тієї, яка справді є в моделі. Сильна кореляція обумовлює великі похибки / дисперсії коефіцієнтів (що стосуються матриці ).(XTX)−1
Однак ця велика дисперсія, обумовлена мультиколіонерністю, не спостерігається в діагностиці як p-значення або стандартна похибка коефіцієнтів, оскільки вони засновані на меншій матриці проектування з меншими регресорами. (і немає простого методу для обчислення таких типів статистики для LASSO)X
Приклад: графік нижче, на якому відображаються результати моделі іграшки для деякого сигналу, що є лінійною сумою 10 гауссових кривих (це, наприклад, може нагадувати хімічний аналіз, коли сигнал для спектру вважається лінійною сумою кілька компонентів). Сигнал 10 кривих оснащений моделлю з 100 компонентів (криві Гаусса з різним середнім значенням) за допомогою LASSO. Сигнал добре оцінений (порівняйте червону та чорну криві, які досить близькі). Але фактичні базові коефіцієнти недостатньо оцінені і можуть бути абсолютно помилковими (порівняйте червону та чорну смуги з крапками, які не однакові). Дивіться також останні 10 коефіцієнтів:
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
Модель LASSO вибирає коефіцієнти, які є дуже приблизними, але з точки зору самих коефіцієнтів це означає велику помилку, коли коефіцієнт, який повинен бути ненульовим, оцінюється як нульовий, а сусідній коефіцієнт, який повинен бути нульовим, оцінюється як ненульовий. Будь-які довірчі інтервали для коефіцієнтів мали б дуже мало сенсу.
LASSO фітинги
Поетапна підгонка
Як порівняння, та сама крива може бути встановлена ступінчастим алгоритмом, що веде до зображення нижче. (з подібними проблемами, що коефіцієнти близькі, але не відповідають)
Навіть якщо ви враховуєте точність кривої (а не параметри, з яких у попередньому пункті було зрозуміло, що це не має сенсу), тоді вам доведеться мати справу з надмірною обробкою. Коли ви робите процедуру підгонки з LASSO, тоді ви використовуєте навчальні дані (для підключення моделей з різними параметрами) та дані тесту / перевірки (щоб налаштувати / знайти, який є найкращим параметром), але ви також повинні використовувати третій окремий набір даних тесту / перевірки, щоб з’ясувати ефективність даних.
Значення p або щось подібне не працює, тому що ви працюєте за налаштованою моделлю, яка вибирає вишні і відрізняється (набагато більшими ступенями свободи) від звичайного методу лінійної підгонки.
страждаєте від тих же проблем, що поступова регресія робить?
Ви, мабуть, посилаєтесь на такі проблеми, як зміщення у таких значеннях, як , p-значення, F-бали або стандартні помилки. Я вважаю, що LASSO не використовується для вирішення цих проблем.R2
Я подумав, що головна причина використання LASSO замість ступінчастої регресії полягає в тому, що LASSO дозволяє вибирати менш жадібний параметр, на який менше впливає мультиколінарність. (більше відмінностей між LASSO та поетапно: перевагу LASSO над вибором / вилученням вперед в плані похибки прогнозування перехресної перевірки моделі )
Код для прикладу зображення
# 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)