Получить стандартную ошибку среднего значения, вычисленную в seaborn.catplot - PullRequest
0 голосов
/ 12 марта 2020

Я использую seaborn.catplot с kind='point' для построения своих данных. Я хотел бы рассчитать стандартную ошибку среднего (SEM) для каждой переменной оттенка и каждой категории, используя тот же метод , что и для seaborn , чтобы убедиться, что мои вычисленные значения точно совпадают с графиками ошибок. Решение по умолчанию для вычисления SEM и 95% -ных доверительных интервалов (CI) содержит алгоритм начальной загрузки, где среднее значение загружается 1000 раз для вычисления SEM / CI. В более раннем посте я видел метод, который мог бы предложить функции для этого (используя функции исходного кода seaborn, такие как seaborn.utils.ci() и seaborn.algorithms.bootstrap()), но я не уверен, как это реализовать. Поскольку при начальной загрузке используется случайная выборка, также необходимо убедиться, что один и тот же массив из 1000 средних произведен как для построения графика, так и для получения SEM.

Вот пример кода:

import numpy as np
import pandas as pd
import seaborn as sns

# simulate data
rng = np.random.RandomState(42)
measure_names = np.tile(np.repeat(['Train BAC','Test BAC'],10),2)
model_numbers = np.repeat([0,1],20)
measure_values = np.concatenate((rng.uniform(low=0.6,high=1,size=20),
                                rng.uniform(low=0.5,high=0.8,size=20)
                                ))
folds=np.tile([1,2,3,4,5,6,7,8,9,10],4)

plot_df = pd.DataFrame({'model_number':model_numbers,
                        'measure_name':measure_names,
                        'measure_value':measure_values,
                        'outer_fold':folds})

# plot data as pointplot
g = sns.catplot(x='model_number',
                y='measure_value',
                hue='measure_name',
                kind='point',
                seed=rng,
                data=plot_df)

, который дает:

enter image description here

Я хотел бы получить SEM для всех показателей поезда и теста для обеих моделей. То есть:

# obtain SEM for each score in each model using the same method as in sns.catplot
model_0_train_bac = plot_df.loc[((plot_df['model_number'] == 0) & (plot_df['measure_name'] == 'Train BAC')),'measure_value']
model_0_test_bac = plot_df.loc[((plot_df['model_number'] == 0) & (plot_df['measure_name'] == 'Test BAC')),'measure_value']
model_1_train_bac = plot_df.loc[((plot_df['model_number'] == 1) & (plot_df['measure_name'] == 'Train BAC')),'measure_value']
model_1_test_bac = plot_df.loc[((plot_df['model_number'] == 1) & (plot_df['measure_name'] == 'Test BAC')),'measure_value']

1 Ответ

0 голосов
/ 12 марта 2020

Я не уверен, что получил требование, чтобы у вас были взяты те же самые образцы. По определению, самозагрузка работает путем взятия случайной выборки, и поэтому от одного прогона к следующему будет небольшая изменчивость (если я не ошибаюсь).

Вы можете рассчитать CI так же, как это делает seaborn Итак:

# simulate data
rng = np.random.RandomState(42)
measure_names = np.tile(np.repeat(['Train BAC','Test BAC'],10),2)
model_numbers = np.repeat([0,1],20)
measure_values = np.concatenate((rng.uniform(low=0.6,high=1,size=20),
                                rng.uniform(low=0.5,high=0.8,size=20)
                                ))
folds=np.tile([1,2,3,4,5,6,7,8,9,10],4)

plot_df = pd.DataFrame({'model_number':model_numbers,
                        'measure_name':measure_names,
                        'measure_value':measure_values,
                        'outer_fold':folds})

x_col = 'model_number'
y_col = 'measure_value'
hue_col = 'measure_name'
ci = 95
est = np.mean
n_boot = 1000

for gr,temp_df in plot_df.groupby([hue_col,x_col]):
    print(gr,est(temp_df[y_col]), sns.utils.ci(sns.algorithms.bootstrap(temp_df[y_col], func=est,
                                          n_boot=n_boot,
                                          units=None,
                                          seed=rng)))

, который выводит:

('Test BAC', 0) 0.7581071363371585 [0.69217109 0.8316217 ]
('Test BAC', 1) 0.6527812067134964 [0.59523784 0.71539669]
('Train BAC', 0) 0.8080546943810699 [0.73214414 0.88102816]
('Train BAC', 1) 0.6201161718490218 [0.57978654 0.66241543] 

Обратите внимание, что если вы выполните l oop во второй раз, вы получите CI, которые похожи, но не совсем то же самое.

Если вы действительно хотите получить точные значения, которые использовались на графике Seaborn (обратите внимание, что, опять же, эти значения будут немного отличаться, если вы строите те же данные во второй раз), то вы могли бы извлеките значения непосредственно из художников Line2D, использованных для рисования панелей ошибок:

g = sns.catplot(x=x_col,
                y=y_col,
                hue=hue_col,
                kind='point',
                ci=ci,
                estimator=est,
                n_boot=n_boot,
                seed=rng,
                data=plot_df)
for l in g.ax.lines:
    print(l.get_data())

output:

(array([0., 1.]), array([0.80805469, 0.62011617]))
(array([0., 0.]), array([0.73203808, 0.88129836])) # <<<<
(array([1., 1.]), array([0.57828366, 0.66300033])) # <<<<
(array([0., 1.]), array([0.75810714, 0.65278121]))
(array([0., 0.]), array([0.69124145, 0.83297914])) # <<<<
(array([1., 1.]), array([0.59113739, 0.71572469])) # <<<<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...