Обчислення p-значень у обмежених (негативних) найменших квадратах


10

Я використовував Matlab для виконання обмежених найменших квадратів (звичайних найменших квадратів), і він автоматично виводить коефіцієнти, статистику тесту та p-значення.

Моє запитання полягає в тому, що, виконуючи обмежені найменші квадрати (суворо негативні коефіцієнти), він виводить лише коефіцієнти, БЕЗ статистики тесту, р-значень.

Чи можна обчислити ці значення для забезпечення значущості? І чому він не доступний безпосередньо в програмному забезпеченні (або будь-якому іншому програмному забезпеченні з цього питання?)


2
Чи можете ви уточнити, що ви маєте на увазі під "* обчислити, щоб ... забезпечити важливість"? Ви не можете бути впевнені, що отримаєте значення, наприклад, у звичайних найменших квадратах; ви можете перевірити їх значимість, але у вас немає способу переконатися, що ви його отримаєте. Ви маєте на увазі "чи існує спосіб провести тест на значимість із обмеженими розмірами найменших квадратів?"
Glen_b -Встановіть Моніку

@Glen_b надавши назву питання, я думаю, що "забезпечити" еквівалентно встановленню.
Гетероскедастичний Джим

1
@HeteroskedasticJim Ймовірно; це, безумовно, мало б сенс, якби констатація була наміром.
Glen_b -Встановіть Моніку

Так, я мав на увазі, як обчислити значення, щоб перевірити, чи потрібно нульову гіпотезу відхиляти чи ні.
cgo

1
Яка ваша мета щодо вираження p-значень? Яке значення / значення / функція вони матимуть для вас? Причина, чому я прошу, полягає в тому, що якщо ви просто зацікавлені в дійсності вашої моделі, ви можете перевірити це, розділивши свої дані і використавши частину даних для тестування отриманої моделі та отримання кількісного виміру ефективності роботи модель.
Секст Емпірік

Відповіді:


7

Розв’язування негативних найменших квадратів (NNLS) засноване на алгоритмі, який відрізняє його від звичайних найменших квадратів.

Алгебраїчний вираз для стандартної помилки (не працює)

За допомогою регулярних найменших квадратів ви можете виразити p-значення, використовуючи t-тест у поєднанні з оцінками дисперсії коефіцієнтів.

Цей вислів для зразка дисперсії оцінки коефіцієнтів & thetas є V г ( θ ) = σ 2 ( Х Т Х ) - 1 Дисперсія помилки σ , як правило , невідомі , але вона може бути оцінена з використанням залишків . Цей вираз можна вивести алгебраїчно, починаючи з виразу для коефіцієнтів з точки зору вимірювань yθ^

Var(θ^)=σ2(XTX)1
σy

θ^=(XTX)1XTy

θ

Зворотна інформаційна матриця Фішера (не застосовується)

Дисперсія / розподіл оцінки коефіцієнтів також асимптотично наближається до спостережуваної інформаційної матриці Фішера :

(θ^θ)dN(0,I(θ^))

Але я не впевнений, чи добре це стосується тут. Оцінка NNLS не є об'єктивною оцінкою.

Метод Монте-Карло

Кожен раз, коли вирази стають занадто складними, ви можете використовувати обчислювальний метод для оцінки помилки. За допомогою методу Монте-Карло ви моделюєте розподіл випадковості експерименту, імітуючи повтори експерименту (перерахунок / моделювання нових даних) і на основі цього оцінюєте дисперсію коефіцієнтів.

θ^σ^


3
χ2

@whuber Я додав рішення нижче, засноване на обчисленні інформації про рибалки коваріатної матриці, для якої коефіцієнти nnls неотрицальні, і обчислення цієї інформації рибалки за перетвореною шкалою журналу, щоб зробити криву ймовірності більш симетричною та застосувати обмеження позитивності на коефіцієнти. Коментарі вітаємо!
Том Венсельєр

4

Якби ОК з допомогою RI думаю , ви також можете використовувати bbmle«s mle2функцію для оптимізації найменших квадратів функцію правдоподібності і обчислити 95% довірчі інтервали на невід'ємними коефіцієнтами NNLS. Крім того, ви можете взяти до уваги, що ваші коефіцієнти не можуть бути негативними шляхом оптимізації журналу ваших коефіцієнтів, так що за зворотньо трансформованою шкалою вони ніколи не можуть стати негативними.

Ось чисельний приклад, що ілюструє такий підхід, тут у контексті деконструкції суперпозиції хроматографічних піків у формі гаусса із гауссовим шумом на них: (будь-які коментарі вітаються)

Спочатку давайте змоделюємо деякі дані:

require(Matrix)
n = 200
x = 1:n
npeaks = 20
set.seed(123)
u = sample(x, npeaks, replace=FALSE) # peak locations which later need to be estimated
peakhrange = c(10,1E3) # peak height range
h = 10^runif(npeaks, min=log10(min(peakhrange)), max=log10(max(peakhrange))) # simulated peak heights, to be estimated
a = rep(0, n) # locations of spikes of simulated spike train, need to be estimated
a[u] = h
gauspeak = function(x, u, w, h=1) h*exp(((x-u)^2)/(-2*(w^2))) # shape of single peak, assumed to be known
bM = do.call(cbind, lapply(1:n, function (u) gauspeak(x, u=u, w=5, h=1) )) # banded matrix with theoretical peak shape function used
y_nonoise = as.vector(bM %*% a) # noiseless simulated signal = linear convolution of spike train with peak shape function
y = y_nonoise + rnorm(n, mean=0, sd=100) # simulated signal with gaussian noise on it
y = pmax(y,0)
par(mfrow=c(1,1))
plot(y, type="l", ylab="Signal", xlab="x", main="Simulated spike train (red) to be estimated given known blur kernel & with Gaussian noise")
lines(a, type="h", col="red")

введіть тут опис зображення

Давайте тепер деконвелюємо виміряний шумний сигнал yза допомогою смугової матриці, що містить зміщенну копію відомого ядра розмитості у формі гаусса bM(це наша матриця коваріації / проектування).

Спочатку давайте деконвелюємо сигнал із негативними найменшими квадратами:

library(nnls)
library(microbenchmark)
microbenchmark(a_nnls <- nnls(A=bM,b=y)$x) # 5.5 ms
plot(x, y, type="l", main="Ground truth (red), nnls estimate (blue)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_nnls, type="h", col="blue", lwd=2)
yhat = as.vector(bM %*% a_nnls) # predicted values
residuals = (y-yhat)
nonzero = (a_nnls!=0) # nonzero coefficients
n = nrow(bM)
p = sum(nonzero)+1 # nr of estimated parameters = nr of nonzero coefficients+estimated variance
variance = sum(residuals^2)/(n-p) # estimated variance = 8114.505

введіть тут опис зображення

Тепер давайте оптимізуємо негативну ймовірність логарифмації нашої гауссової мети збитків та оптимізуємо журнал ваших коефіцієнтів, щоб у зворотній формі масштабу вони ніколи не були негативними:

library(bbmle)
XM=as.matrix(bM)[,nonzero,drop=FALSE] # design matrix, keeping only covariates with nonnegative nnls coefs
colnames(XM)=paste0("v",as.character(1:n))[nonzero]
yv=as.vector(y) # response
# negative log likelihood function for gaussian loss
NEGLL_gaus_logbetas <- function(logbetas, X=XM, y=yv, sd=sqrt(variance)) {
  -sum(stats::dnorm(x = y, mean = X %*% exp(logbetas), sd = sd, log = TRUE))
}  
parnames(NEGLL_gaus_logbetas) <- colnames(XM)
system.time(fit <- mle2(
  minuslogl = NEGLL_gaus_logbetas, 
  start = setNames(log(a_nnls[nonzero]+1E-10), colnames(XM)), # we initialise with nnls estimates
  vecpar = TRUE,
  optimizer = "nlminb"
)) # takes 0.86s
AIC(fit) # 2394.857
summary(fit) # now gives log(coefficients) (note that p values are 2 sided)
# Coefficients:
#       Estimate Std. Error z value     Pr(z)    
# v10    4.57339    2.28665  2.0000 0.0454962 *  
# v11    5.30521    1.10127  4.8173 1.455e-06 ***
# v27    3.36162    1.37185  2.4504 0.0142689 *  
# v38    3.08328   23.98324  0.1286 0.8977059    
# v39    3.88101   12.01675  0.3230 0.7467206    
# v48    5.63771    3.33932  1.6883 0.0913571 .  
# v49    4.07475   16.21209  0.2513 0.8015511    
# v58    3.77749   19.78448  0.1909 0.8485789    
# v59    6.28745    1.53541  4.0950 4.222e-05 ***
# v70    1.23613  222.34992  0.0056 0.9955643    
# v71    2.67320   54.28789  0.0492 0.9607271    
# v80    5.54908    1.12656  4.9257 8.407e-07 ***
# v86    5.96813    9.31872  0.6404 0.5218830    
# v87    4.27829   84.86010  0.0504 0.9597911    
# v88    4.83853   21.42043  0.2259 0.8212918    
# v107   6.11318    0.64794  9.4348 < 2.2e-16 ***
# v108   4.13673    4.85345  0.8523 0.3940316    
# v117   3.27223    1.86578  1.7538 0.0794627 .  
# v129   4.48811    2.82435  1.5891 0.1120434    
# v130   4.79551    2.04481  2.3452 0.0190165 *  
# v145   3.97314    0.60547  6.5620 5.308e-11 ***
# v157   5.49003    0.13670 40.1608 < 2.2e-16 ***
# v172   5.88622    1.65908  3.5479 0.0003884 ***
# v173   6.49017    1.08156  6.0008 1.964e-09 ***
# v181   6.79913    1.81802  3.7399 0.0001841 ***
# v182   5.43450    7.66955  0.7086 0.4785848    
# v188   1.51878  233.81977  0.0065 0.9948174    
# v189   5.06634    5.20058  0.9742 0.3299632    
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# -2 log L: 2338.857 
exp(confint(fit, method="quad"))  # backtransformed confidence intervals calculated via quadratic approximation (=Wald confidence intervals)
#              2.5 %        97.5 %
# v10   1.095964e+00  8.562480e+03
# v11   2.326040e+01  1.743531e+03
# v27   1.959787e+00  4.242829e+02
# v38   8.403942e-20  5.670507e+21
# v39   2.863032e-09  8.206810e+11
# v48   4.036402e-01  1.953696e+05
# v49   9.330044e-13  3.710221e+15
# v58   6.309090e-16  3.027742e+18
# v59   2.652533e+01  1.090313e+04
# v70  1.871739e-189 6.330566e+189
# v71   8.933534e-46  2.349031e+47
# v80   2.824905e+01  2.338118e+03
# v86   4.568985e-06  3.342200e+10
# v87   4.216892e-71  1.233336e+74
# v88   7.383119e-17  2.159994e+20
# v107  1.268806e+02  1.608602e+03
# v108  4.626990e-03  8.468795e+05
# v117  6.806996e-01  1.021572e+03
# v129  3.508065e-01  2.255556e+04
# v130  2.198449e+00  6.655952e+03
# v145  1.622306e+01  1.741383e+02
# v157  1.853224e+02  3.167003e+02
# v172  1.393601e+01  9.301732e+03
# v173  7.907170e+01  5.486191e+03
# v181  2.542890e+01  3.164652e+04
# v182  6.789470e-05  7.735850e+08
# v188 4.284006e-199 4.867958e+199
# v189  5.936664e-03  4.236704e+06
library(broom)
signlevels = tidy(fit)$p.value/2 # 1-sided p values for peak to be sign higher than 1
adjsignlevels = p.adjust(signlevels, method="fdr") # FDR corrected p values
a_nnlsbbmle = exp(coef(fit)) # exp to backtransform
max(a_nnls[nonzero]-a_nnlsbbmle) # -9.981704e-11, coefficients as expected almost the same
plot(x, y, type="l", main="Ground truth (red), nnls bbmle logcoeff estimate (blue & green, green=FDR p value<0.05)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(x[nonzero], -a_nnlsbbmle, type="h", col="blue", lwd=2)
lines(x[nonzero][(adjsignlevels<0.05)&(a_nnlsbbmle>1)], -a_nnlsbbmle[(adjsignlevels<0.05)&(a_nnlsbbmle>1)], 
      type="h", col="green", lwd=2)
sum((signlevels<0.05)&(a_nnlsbbmle>1)) # 14 peaks significantly higher than 1 before FDR correction
sum((adjsignlevels<0.05)&(a_nnlsbbmle>1)) # 11 peaks significant after FDR correction

введіть тут опис зображення

Я не намагався порівнювати продуктивність цього методу відносно непараметричного чи параметричного завантаження, але це, безумовно, набагато швидше.

Я також схилявся до думки, що я повинен бути в змозі обчислити довірчі інтервали для негативних nnlsкоефіцієнтів на основі спостережуваної матриці інформації Фішера, обчислену за шкалою коефіцієнта, трансформованої в журналі, щоб застосувати обмеження негативності та оцінити за nnlsоцінками.

Я думаю, що це відбувається так, і насправді має бути формально ідентичним тому, що я робив, використовуючи mle2вище:

XM=as.matrix(bM)[,nonzero,drop=FALSE] # design matrix
posbetas = a_nnls[nonzero] # nonzero nnls coefficients
dispersion=sum(residuals^2)/(n-p) # estimated dispersion (variance in case of gaussian noise) (1 if noise were poisson or binomial)
information_matrix = t(XM) %*% XM # observed Fisher information matrix for nonzero coefs, ie negative of the 2nd derivative (Hessian) of the log likelihood at param estimates
scaled_information_matrix = (t(XM) %*% XM)*(1/dispersion) # information matrix scaled by 1/dispersion
# let's now calculate this scaled information matrix on a log transformed Y scale (cf. stat.psu.edu/~sesa/stat504/Lecture/lec2part2.pdf, slide 20 eqn 8 & Table 1) to take into account the nonnegativity constraints on the parameters
scaled_information_matrix_logscale = scaled_information_matrix/((1/posbetas)^2) # scaled information_matrix on transformed log scale=scaled information matrix/(PHI'(betas)^2) if PHI(beta)=log(beta)
vcov_logscale = solve(scaled_information_matrix_logscale) # scaled variance-covariance matrix of coefs on log scale ie of log(posbetas) # PS maybe figure out how to do this in better way using chol2inv & QR decomposition - in R unscaled covariance matrix is calculated as chol2inv(qr(XW_glm)$qr)
SEs_logscale = sqrt(diag(vcov_logscale)) # SEs of coefs on log scale ie of log(posbetas)
posbetas_LOWER95CL = exp(log(posbetas) - 1.96*SEs_logscale)
posbetas_UPPER95CL = exp(log(posbetas) + 1.96*SEs_logscale)
data.frame("2.5 %"=posbetas_LOWER95CL,"97.5 %"=posbetas_UPPER95CL,check.names=F)
#            2.5 %        97.5 %
# 1   1.095874e+00  8.563185e+03
# 2   2.325947e+01  1.743600e+03
# 3   1.959691e+00  4.243037e+02
# 4   8.397159e-20  5.675087e+21
# 5   2.861885e-09  8.210098e+11
# 6   4.036017e-01  1.953882e+05
# 7   9.325838e-13  3.711894e+15
# 8   6.306894e-16  3.028796e+18
# 9   2.652467e+01  1.090340e+04
# 10 1.870702e-189 6.334074e+189
# 11  8.932335e-46  2.349347e+47
# 12  2.824872e+01  2.338145e+03
# 13  4.568282e-06  3.342714e+10
# 14  4.210592e-71  1.235182e+74
# 15  7.380152e-17  2.160863e+20
# 16  1.268778e+02  1.608639e+03
# 17  4.626207e-03  8.470228e+05
# 18  6.806543e-01  1.021640e+03
# 19  3.507709e-01  2.255786e+04
# 20  2.198287e+00  6.656441e+03
# 21  1.622270e+01  1.741421e+02
# 22  1.853214e+02  3.167018e+02
# 23  1.393520e+01  9.302273e+03
# 24  7.906871e+01  5.486398e+03
# 25  2.542730e+01  3.164851e+04
# 26  6.787667e-05  7.737904e+08
# 27 4.249153e-199 4.907886e+199
# 28  5.935583e-03  4.237476e+06
z_logscale = log(posbetas)/SEs_logscale # z values for log(coefs) being greater than 0, ie coefs being > 1 (since log(1) = 0) 
pvals = pnorm(z_logscale, lower.tail=FALSE) # one-sided p values for log(coefs) being greater than 0, ie coefs being > 1 (since log(1) = 0)
pvals.adj = p.adjust(pvals, method="fdr") # FDR corrected p values

plot(x, y, type="l", main="Ground truth (red), nnls estimates (blue & green, green=FDR Wald p value<0.05)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_nnls, type="h", col="blue", lwd=2)
lines(x[nonzero][pvals.adj<0.05], -a_nnls[nonzero][pvals.adj<0.05], 
      type="h", col="green", lwd=2)
sum((pvals<0.05)&(posbetas>1)) # 14 peaks significantly higher than 1 before FDR correction
sum((pvals.adj<0.05)&(posbetas>1)) # 11 peaks significantly higher than 1 after FDR correction

введіть тут опис зображення

Результати цих розрахунків і ті, що повертаються mle2, майже однакові (але набагато швидше), тому я вважаю, що це правильно, і відповідатиме тому, що ми неявно робили з mle2...

Просто встановлення коваріатів з позитивними коефіцієнтами в nnlsпристосуванні з використанням звичайної лінійної моделі fit btw не працює, оскільки така придатність лінійної моделі не враховуватиме обмеження негативності і, таким чином, призведе до безглуздих довірчих інтервалів, які можуть перейти в негативний характер. У цьому документі "Точні умови вибору моделі для маргінального скринінгу" Джейсона Лі та Джонатана Тейлора також представлений метод зробити висновок про вибір після моделей за негативними коефіцієнтами nnls (або LASSO) та використовує для цього усічені розподіли Гаусса. Я не бачив жодної відкрито доступної реалізації цього методу для nnls підходить, хоча для LASSO підходить є селективнийпакет, який робить щось подібне. Якщо у когось трапиться реалізація, будь ласка, дайте мені знати!

У вищевказаному методі можна також розділити дані в наборі тренувань і валідації (наприклад, непарні та парні спостереження) та зробити висновки про коваріати з позитивними коефіцієнтами з навчального набору, а потім обчислити довірчі інтервали & p значення з набору валідації. Це було б трохи стійкіше до перевиконання, хоча це також призвело б до втрати потужності, оскільки можна було б використовувати лише половину даних. Я цього не робив, тому що обмеження негативності саме по собі вже є досить ефективним у захисті від надмірного пристосування.


Коефіцієнти у вашому прикладі повинні мати величезні помилки, оскільки будь-який спайк може бути зміщений на 1 бал, не сильно впливаючи на ймовірність, чи я щось пропускаю? Це змінило б будь-який коефіцієнт на 0, а сусідній 0 на велике значення ...
амеба

Так, це правильно. Але все покращується, якщо ви додасте додатковий штраф у розмірі l0 чи l1, щоб сприяти рідкісним рішенням. Я використовував l0 пеналізовані nnls моделі, що підходять, використовуючи адаптивний алгоритм хребта, який дає дуже рідкісні рішення. Тести на коефіцієнт ймовірності можуть спрацювати в моєму випадку, роблячи одноразові вилучення, але не перевстановлюючи модель зі скинутим терміном
Том Венселер,

1
Я просто не розумію , як ви можете отримати що - небудь з великими значеннями г ...
амеба

Ну, а обмеження негативу дуже допомагають, звичайно, плюс той факт, що ми робимо висновок після вибору, тобто зберігаємо активний позитивний коефіцієнт, встановлений як фіксований ...
Том Вензелер,

Ой, я не зрозумів, що це було висновком після вибору!
амеба

1

Щоб бути більш конкретним щодо методу Монте-Карло @ згаданий Мартійн do, ви можете використовувати Bootstrap, метод перекомпонування, який передбачає вибірку з вихідних даних (із заміною) декількох наборів даних для оцінки розподілу розрахункових коефіцієнтів і, отже, будь-якої відповідної статистики, включаючи довірчі інтервали та p-значення.

Широко використовуваний метод детально описаний тут: Ефрон, Бредлі. "Методи завантаження: ще один погляд на нож". Прориви в статистиці. Спрингер, Нью-Йорк, штат Нью-Йорк, 1992. 569-593.

Matlab реалізував його, див. Https://www.mathworks.com/help/stats/bootstrp.html, зокрема розділ під назвою "завантаження регресійної моделі".


1
Запуск завантаження буде корисним для особливого випадку, коли помилки не поширюються по Гауссу. Це може виникнути в багатьох проблемах, де параметри обмежені (наприклад, залежна змінна також може бути обмежена, що суперечить Гауссовим розподіленим помилкам), але обов'язково завжди. Наприклад: якщо у розчині є суміш хімічних речовин (за моделюванням строго позитивних кількостей доданих компонентів), і ви вимірюєте декілька властивостей розчину, то помилка вимірювання може бути розподілена Гауссом, який можна параметризувати та оцінити. не потрібно завантажувати.
Секст Емпірік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.