Skip to content

Instantly share code, notes, and snippets.

@rcsmit
Created June 11, 2024 14:49
Show Gist options
  • Save rcsmit/4a74acfd759ace013ff9cf8265e6d7fa to your computer and use it in GitHub Desktop.
Save rcsmit/4a74acfd759ace013ff9cf8265e6d7fa to your computer and use it in GitHub Desktop.
Why is the CI-width so small?
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()
@rcsmit
Copy link
Author

rcsmit commented Jun 11, 2024

because the CI is for the found prediction, but not for the measure points?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment