Подтвердить что ты не робот

Доверительный интервал для LOWESS в Python

Как бы я вычислил доверительные интервалы для регрессии LOWESS в Python? Я хотел бы добавить их как заштрихованную область в график LOESS, созданный с помощью следующего кода (другие пакеты, кроме statsmodels, тоже прекрасны).

import numpy as np
import pylab as plt
import statsmodels.api as sm

x = np.linspace(0,2*np.pi,100)
y = np.sin(x) + np.random.random(100) * 0.2
lowess = sm.nonparametric.lowess(y, x, frac=0.1)

plt.plot(x, y, '+')
plt.plot(lowess[:, 0], lowess[:, 1])
plt.show()

Я добавил примерный график с доверительным интервалом ниже от webblog Серьезная статистика (он создается с использованием ggplot в R).

enter image description here

4b9b3361

Ответ 1

LOESS не имеет явного понятия стандартной ошибки. В этом контексте это ничего не значит. С тех пор вы застряли с подходом грубой силы.

Загрузите свои данные. Ваш подход подходит к кривой LOESS для загруженных данных. Посмотрите на середину этой страницы, чтобы найти красивую картину того, что вы делаете. http://statweb.stanford.edu/~susan/courses/s208/node20.html

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

Как только у вас будет большое количество различных кривых LOESS, вы можете найти верхний и нижний X-ый процентили.

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

Ответ 2

Это очень старый вопрос, но он один из первых, который появляется в поиске Google. Вы можете сделать это, используя функцию loess() из scikit-misc. Вот пример (я попытался сохранить ваши исходные имена переменных, но немного увеличил шум, чтобы сделать его более заметным)

import numpy as np
import pylab as plt
from skmisc.loess import loess

x = np.linspace(0,2*np.pi,100)
y = np.sin(x) + np.random.random(100) * 0.4

l = loess(x,y)
l.fit()
pred = l.predict(x, stderror=True)
conf = pred.confidence()

lowess = pred.values
ll = conf.lower
ul = conf.upper

plt.plot(x, y, '+')
plt.plot(x, lowess)
plt.fill_between(x,ll,ul,alpha=.33)
plt.show()

результат:

loess smooth with CI