Source code for WORC.plotting.compute_CI
#!/usr/bin/env python
# Copyright 2016-2019 Biomedical Imaging Group Rotterdam, Departments of
# Medical Informatics and Radiology, Erasmus MC, Rotterdam, The Netherlands
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import numpy as np
import scipy.stats as st
from scipy.special import logit, expit
[docs]def compute_confidence_bootstrap(bootstrap_metric, test_metric, N_1, alpha=0.95):
"""
Function to calculate confidence interval for bootstrapped samples.
metric: numpy array containing the result for a metric for the different bootstrap iterations
test_metric: the value of the metric evaluated on the true, full test set
alpha: float ranging from 0 to 1 to calculate the alpha*100% CI, default 0.95
"""
metric_std = np.std(bootstrap_metric)
CI = st.norm.interval(alpha, loc=test_metric, scale=metric_std)
return CI
[docs]def compute_confidence(metric, N_train, N_test, alpha=0.95):
"""
Function to calculate the adjusted confidence interval for cross-validation.
metric: numpy array containing the result for a metric for the different cross validations
(e.g. If 20 cross-validations are performed it is a list of length 20 with the calculated accuracy for
each cross validation)
N_train: Integer, number of training samples
N_test: Integer, number of test_samples
alpha: float ranging from 0 to 1 to calculate the alpha*100% CI, default 0.95
"""
# Remove NaN values if they are there
if np.isnan(metric).any():
print('[WORC Warning] Array contains nan: removing.')
metric = np.asarray(metric)
metric = metric[np.logical_not(np.isnan(metric))]
# Convert to floats, as python 2 rounds the divisions if we have integers
N_train = float(N_train)
N_test = float(N_test)
N_iterations = float(len(metric))
if N_iterations == 1.0:
print('[WORC Warning] Cannot compute a confidence interval for a single iteration.')
print('[WORC Warning] CI will be set to value of single iteration.')
metric_average = np.mean(metric)
CI = (metric_average, metric_average)
else:
metric_average = np.mean(metric)
S_uj = 1.0 / (N_iterations - 1) * np.sum((metric_average - metric)**2.0)
metric_std = np.sqrt((1.0/N_iterations + N_test/N_train)*S_uj)
CI = st.t.interval(alpha, N_iterations-1, loc=metric_average, scale=metric_std)
if np.isnan(CI[0]) and np.isnan(CI[1]):
# When we cannot compute a CI, just give the averages
CI = (metric_average, metric_average)
return CI
[docs]def compute_confidence_logit(metric, N_train, N_test, alpha=0.95):
"""
Function to calculate the adjusted confidence interval
metric: numpy array containing the result for a metric for the different cross validations
(e.g. If 20 cross-validations are performed it is a list of length 20 with the calculated accuracy for
each cross validation)
N_train: Integer, number of training samples
N_test: Integer, number of test_samples
alpha: float ranging from 0 to 1 to calculate the alpha*100% CI, default 95%
"""
N_iterations = len(metric)
# Compute average of logit function
# metric_logit = [logit(x) for x in metric]
logit_average = logit(np.mean(metric))
# Compute metric average and corrected resampled t-test metric std
metric_average = np.mean(metric)
S_uj = 1.0 / (N_iterations - 1) * np.sum((metric_average - metric)**2.0)
metric_std = np.sqrt((1.0/N_iterations + N_test/N_train)*S_uj)
# Compute z(1-alpha/2) quantile
q1 = 1.0-(1-alpha)/2
z = st.t.ppf(q1, N_iterations - 1)
# Compute logit confidence intervals according to Barbiero
theta_L = logit_average - z * metric_std/(metric_average*(1 - metric_average))
theta_U = logit_average + z * metric_std/(metric_average*(1 - metric_average))
# Transform back
CI = (expit(theta_L), expit(theta_U))
return CI