2015-12-15 4 views
17

In che modo Seaborn calcola le barre di errore? esempio:deviazione standard e barre degli errori nella funzione tsplot seaborn in 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() 

come vengono calcolati i ci_bars (o ci_bands)?

inoltre, è possibile fare tsplot trama in stile ci_bars dove le barre di errore o bande corrispondono la deviazione standard dei valori in ogni punto? (e non errore standard di media, o bootstrap)

+3

Eventuali duplicati di [ Come vengono calcolate le "bande di errore" in Seaborn tsplot?] (Http://stackoverflow.com/questions/29481134/how-are-the-error-bands-in-seaborn-tsplot-calculated) – mwaskom

+1

@mwaskom: my additio la domanda nale è come tracciare barre o bande in '' tsplot'' che riflettono la deviazione standard, non l'errore standard di media o una stima di bootstrap. È possibile? per i miei dati i bootstrap sono troppo stretti e stdev è una rappresentazione migliore – lgd

risposta

9

Poiché la funzione tsplot non fornisce un modo per impostare direttamente i valori della barra di errore o per modificare il metodo utilizzato per calcolarli, l'unica soluzione che ho trovato è stata la patch di scimmia il modulo 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 

Poi, per tracciare con le barre di errore deviazione standard utilizzano

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

o

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

per tracciare con una banda di deviazione standard.

Edit: Ispirato da this answer su SO, un altro approccio (probabilmente più sensibile) sarebbe quella di utilizzare il seguente invece di 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: Dal momento che hai chiesto su come tsplot calcola i propri intervalli di confidenza: si utilizza bootstrapping to estimate the distribution of the mean value in ciascun punto temporale e quindi trova i valori percentile alto e basso (che corrispondono all'intervallo di confidenza utilizzato) da queste distribuzioni. L'intervallo di confidenza predefinito è del 68% - equivalente a ± una deviazione standard della media, assumendo la distribuzione normale. I rispettivi percentili bassi e alti sono il 16% e l'84%. È possibile modificare l'intervallo di confidenza tramite l'argomento della parola chiave ci.

+0

Grazie Martin, buona soluzione. Sfortunatamente l'interprete python si lamenta della sintassi subito dopo l'argomento '* args' – luca

14

In Seaborn v0.8.0 (luglio 2017) è stata aggiunta la possibilità di utilizzare le barre di errore per mostrare le deviazioni standard anziché gli intervalli di confidenza del bootstrap nella maggior parte delle funzioni statistiche inserendo ci = "sd". Quindi, questo funziona ora

sns.tsplot(data=data, ci="sd") 

Per le versioni precedenti Seaborn una soluzione per il tracciato deviazione standard potrebbe essere quella di usare matplotlib errorbar in cima Seaborn 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() 

enter image description here