Created
June 11, 2024 14:49
-
-
Save rcsmit/4a74acfd759ace013ff9cf8265e6d7fa to your computer and use it in GitHub Desktop.
Why is the CI-width so small?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
import streamlit as st | |
import plotly.graph_objects as go | |
import numpy as np | |
import statsmodels.api as sm | |
// output: https://twitter.com/rcsmit/status/1800539585841344854 | |
def test(): | |
# Voorbeeld DataFrame met uitgebreide data | |
# Voorbeeld DataFrame met seizoensgebonden data | |
np.random.seed(0) # Voor reproductibiliteit | |
weeks_per_year = 52 | |
years = 3 | |
data = { | |
'jaar': [2020]*weeks_per_year + [2021]*weeks_per_year + [2022]*weeks_per_year, | |
'week': list(range(1, weeks_per_year + 1)) * years, | |
} | |
# Voeg een sterke seizoensgebonden component toe aan de overlijdensdata | |
base_overledenen = 100 | |
seasonal_amplitude = 20 | |
noise = np.random.normal(0, 50, weeks_per_year * years) | |
seasonal_pattern = base_overledenen + seasonal_amplitude * np.sin(2 * np.pi * np.array(data['week']) / weeks_per_year) + noise | |
data['overledenen'] = seasonal_pattern | |
df = pd.DataFrame(data) | |
# Maak een tijdsvariabele | |
df['tijd'] = df['jaar'] + (df['week'] - 1) / 52 | |
# Voeg sinus- en cosinustermen toe voor seizoensgebondenheid (met een periode van 1 jaar) | |
df['sin'] = np.sin(2 * np.pi * df['week'] / 52) | |
df['cos'] = np.cos(2 * np.pi * df['week'] / 52) | |
# Definieer de onafhankelijke variabelen (met een constante term) | |
X = df[['tijd', 'sin', 'cos']] | |
X = sm.add_constant(X) # Voegt een constante term toe aan het model | |
# Afhankelijke variabele | |
y = df['overledenen'] | |
# Pas het lineaire regressiemodel toe | |
model = sm.OLS(y, X).fit() | |
# Maak voorspellingen en bereken betrouwbaarheidsintervallen | |
df['voorspeld'] = model.predict(X) | |
voorspellings_interval = model.get_prediction(X).conf_int(alpha=0.05) | |
df['lower_ci'] = voorspellings_interval[:, 0] | |
df['upper_ci'] = voorspellings_interval[:, 1] | |
# Maak een interactieve plot met Plotly | |
fig = go.Figure() | |
# Voeg de werkelijke data toe | |
fig.add_trace(go.Scatter( | |
x=df['tijd'], | |
y=df['overledenen'], | |
mode='markers', | |
name='Werkelijke data' | |
)) | |
# Voeg de voorspelde lijn toe | |
fig.add_trace(go.Scatter( | |
x=df['tijd'], | |
y=df['voorspeld'], | |
mode='lines', | |
name='Voorspeld' | |
)) | |
# Voeg de betrouwbaarheidsinterval toe | |
fig.add_trace(go.Scatter( | |
x=df['tijd'], | |
y=df['upper_ci'], | |
mode='lines', | |
fill=None, | |
line_color='lightgrey', | |
name='Bovenste CI' | |
)) | |
fig.add_trace(go.Scatter( | |
x=df['tijd'], | |
y=df['lower_ci'], | |
mode='lines', | |
fill='tonexty', # Vul het gebied tussen de lijnen | |
line_color='lightgrey', | |
name='Onderste CI' | |
)) | |
# Titel en labels toevoegen | |
fig.update_layout( | |
title='Voorspelling van Overledenen met 95% Betrouwbaarheidsinterval', | |
xaxis_title='Tijd', | |
yaxis_title='Aantal Overledenen' | |
) | |
st.plotly_chart(fig) | |
test() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
because the CI is for the found prediction, but not for the measure points?