Я намагаюся зробити регресію на гетеросептичних даних, де я намагаюся передбачити відхилення помилок, а також середні значення з точки зору лінійної моделі. Щось на зразок цього:
Я намагаюся зробити регресію на гетеросептичних даних, де я намагаюся передбачити відхилення помилок, а також середні значення з точки зору лінійної моделі. Щось на зразок цього:
Відповіді:
Тепер це лише коротка історія. Більш довга версія включає в себе набагато більше видів регресії, включаючи медіану середньої регресії, деіваріантну регресію Демінга та регресію для мінімізації помилок помилково поставлених проблем, які не мають особливого відношення корисності кривої придатності до мінімізації розповсюдженої помилки. Останнє - це мандрівник, але дивіться цеяк приклад. Так що велике значення має те, що відповіді намагається отримати. Як правило, якщо хочеться встановити взаємозв'язок між змінними, рутинна OLS не є методом вибору, і регрес Тейла був би швидким і брудним покращенням у цьому. OLS мінімізується лише у напрямку y, тому нахил занадто неглибокий, а перехоплення занадто велике, щоб встановити, що є базовим співвідношенням між змінними. Якщо сказати це іншим способом, OLS дає найменшу оцінку помилок ay, заданої x, вона не дає оцінки того, як x змінюється y. Коли величини r дуже високі (0,99999+), мало значення має те, що регресія використовується, а OLS у y приблизно така ж, як OLS в x, але, коли значення r є низькими, OLS у y сильно відрізняється від OLS в х.
Підсумовуючи, багато що залежить від того, які саме міркування є мотивованими в першу чергу робити регресійний аналіз. Це диктує необхідні чисельні методи. Після цього вибору, залишки мають структуру, яка пов'язана з метою регресії, і їх потрібно проаналізувати в цьому більш широкому контексті.
Загальний підхід до подібних проблем полягає в тому, щоб збільшити (регульовану) ймовірність ваших даних.
Ось приклад коду в Python:
import scipy
import numpy as np
# generate toy data for the problem
np.random.seed(1) # fix random seed
n = 1000 # fix problem size
x = np.random.normal(size=n)
t = np.random.normal(size=n)
mean = 1 + x * 2 + t * 3
std = 4 + x * 0.5 + t * 0.6
y = np.random.normal(size=n, loc=mean, scale=std)
# create negative log likelihood
def neg_log_lik(theta):
est_mean = theta[0] + x * theta[1] + t * theta[2]
est_std = np.maximum(theta[3] + x * theta[4] + t * theta[5], 1e-10)
return -sum(scipy.stats.norm.logpdf(y, loc=est_mean, scale=est_std))
# maximize
initial = np.array([0,0,0,1,0,0])
result = scipy.optimize.minimize(neg_log_lik, initial)
# extract point estimation
param = result.x
print(param)
# extract standard error for confidence intervals
std_error = np.sqrt(np.diag(result.hess_inv))
print(std_error)
Результат (оцінки параметрів та їх стандартні помилки), отриманий кодом, є:
[ 0.8724218 1.75510897 2.87661843 3.88917283 0.63696726 0.5788625 ]
[ 0.15073344 0.07351353 0.09515104 0.08086239 0.08422978 0.0853192 ]
Видно, що оцінки близькі до їх справжніх значень, що підтверджує правильність цього моделювання.