Стандартное отклонение и бары ошибок в функции ssplot для морских судов в Python

Как Сиборн вычисляет свои бары ошибок? Пример:

import numpy as np; np.random.seed(22)
import seaborn as sns; sns.set(color_codes=True)
x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
ax = sns.tsplot(data=data, err_style="ci_bars")
plt.show()

как вычисляются ci_bars (или ci_bands)?

также возможно ли сделать график tsplot в стиле ci_bars, где полосы ошибок или диапазоны соответствуют стандартным отклонениям значений в каждый момент времени? (а не стандартная ошибка среднего или бутстрапов)

Ответы

Ответ 1

В Seaborn v0.8.0 (июль 2017) была добавлена ​​возможность использовать полосы ошибок для отображения стандартных отклонений, а не доверительных интервалов начальной загрузки в большинстве статистических функций, поставив ci = "sd". Итак, теперь это работает sns.tsplot(data = data, ci = "sd" )

Для предыдущих версий Seaborn обходной путь для построения стандартного отклонения может заключаться в использовании matplotlib errorbar над морским tsplot:

import numpy as np;
import seaborn as sns;
import pandas as pd
import matplotlib.pyplot as plt

# create a group of time series
num_samples = 90
group_size = 10
x = np.linspace(0, 10, num_samples)
group = np.sin(x) + np.linspace(0, 2, num_samples) + np.random.rand(group_size, num_samples) + np.random.randn(group_size, 1)
df = pd.DataFrame(group.T, index=range(0,num_samples))

# plot time series with seaborn
ax = sns.tsplot(data=df.T.values) #, err_style="unit_traces")

# Add std deviation bars to the previous plot
mean = df.mean(axis=1)
std  = df.std(axis=1)
ax.errorbar(df.index, mean, yerr=std, fmt='-o') #fmt=None to plot bars only

plt.show()

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

Ответ 2

Так как функция tsplot не предоставляет способ напрямую установить значения строки ошибок или изменить метод, используемый для их вычисления, единственным решением, которое я нашел, было удаление обезьяны модуля timeseries:

import seaborn.timeseries

def _plot_std_bars(*args, central_data=None, ci=None, data=None, **kwargs):
    std = data.std(axis=0)
    ci = np.asarray((central_data - std, central_data + std))
    kwargs.update({"central_data": central_data, "ci": ci, "data": data})
    seaborn.timeseries._plot_ci_bars(*args, **kwargs)

def _plot_std_band(*args, central_data=None, ci=None, data=None, **kwargs):
    std = data.std(axis=0)
    ci = np.asarray((central_data - std, central_data + std))
    kwargs.update({"central_data": central_data, "ci": ci, "data": data})
    seaborn.timeseries._plot_ci_band(*args, **kwargs)

seaborn.timeseries._plot_std_bars = _plot_std_bars
seaborn.timeseries._plot_std_band = _plot_std_band

Затем, чтобы построить график со стандартными ошибками, используйте

ax = sns.tsplot(data, err_style="std_bars", n_boot=0)

или

ax = sns.tsplot(data, err_style="std_band", n_boot=0)

для построения со стандартным диапазоном отклонения.

Изменить: Вдохновленный этим ответом на SO, другой (вероятно, более разумный) подход заключался бы в использовании следующих вместо tsplot:

import pandas as pd
import seaborn as sns

df = pd.DataFrame.from_dict({
    "mean": data.mean(axis=0),
    "std": data.std(axis=0)
}).reset_index()

g = sns.FacetGrid(df, size=6)
ax = g.map(plt.errorbar, "index", "mean", "std")
ax.set(xlabel="", ylabel="")

Edit2: поскольку вы спросили о том, как tsplot вычисляет свои доверительные интервалы: он использует загрузку для оценки распределения среднего значения на каждый раз, а затем находит низкие и высокие процентильные значения (которые соответствуют используемому доверительному интервалу) из этих распределений. Доверительный интервал по умолчанию составляет 68% - эквивалент ± одно стандартное отклонение среднего значения, предполагая нормальное распределение. Соответствующие низкие и высокие процентили составляют 16% и 84%. Вы можете изменить доверительный интервал с помощью аргумента ключевого слова ci.