Querschnittsstudie zum Zusammenhang zwischen BMI und Diabetes-Typ-2 bei Pima-Indianerinnen
Woche 5
Autor:in
Benedikt Schnur
1 Einleitung
Diese Analyse untersucht den Zusammenhang zwischen Body-Mass-Index (BMI) und dem Auftreten von Diabetes-Typ-2 bei Pima-Indianerinnen basierend auf einem Datensatz von Kaggle [1]. Die Haupthypothese ist:
\(H_0\): Es besteht keine Assoziation zwischen dem Body-Mass-Index (BMI) und dem Auftreten von Diabetes-Typ-2 bei Pima-Indianerinnen.
Neben dem primären Ziel der BMI-Analyse werden auch sekundäre Endpunkte wie Glukosekonzentration, Blutdruck, Hautdicke, Insulin, Alter und Schwangerschaftsanzahl untersucht.
2 Methoden
2.1 Studiendesign
Querschnittsstudie mit retrospektiver Datenanalyse
Datenerhebung: Sekundärdatenauswertung des Pima-Indianer-Datensatzes
Chi-Quadrat-Tests: Assoziation zwischen kategorialen Variablen und Diabetes-Status
T-Tests: Unterschiede in kontinuierlichen Variablen zwischen Diabetikerinnen und Nicht-Diabetikerinnen
Logistische Regression: Berechnung von Odds Ratios für BMI und andere Variablen
ROC-Analyse: Bewertung der Modellleistung für BMI
3 Ergebnisse
3.1 Datenaufbereitung und initiale Datenanalyse (IDA)
Code
# import librariesimport pandas as pdfrom itables import init_notebook_mode, showimport plotly.graph_objects as goimport plotly.io as piofrom typing import Tupleimport statsmodels.api as smimport numpy as npfrom sklearn.metrics import roc_curve, aucfrom scipy.stats import chi2_contingency, ttest_indimport matplotlibinit_notebook_mode(all_interactive=True)# Define color paletteBENE_COLORS_DARK: Tuple[str, ...] = ("#47476b","#6B5706","#206260","#93003a","#215F80","#973C2B","#008381","#6d3d3d","#595865",)BENE_COLORS_LIGHT: Tuple[str, ...] = ("#7171A7","#B29211","#3BA4A0","#E80060","#3D9ED2","#FC6914","#00B2B0","#A96262","#9593A8",)pio.templates["bene"] = go.layout.Template( layout=go.Layout( colorway=BENE_COLORS_LIGHT, paper_bgcolor="#222", plot_bgcolor="#222" ))pio.templates.default ="plotly_dark+bene"def set_transparency(hex_color: str, transparency: float) ->str:""" Set the transparency of a hex color. Parameters: hex_color (str): The hex color code (e.g., "#47476b"). transparency (float): The transparency level (0.0 to 1.0). Returns: str: The RGBA color code. """if hex_color.startswith("#"): hex_color = hex_color[1:]# Convert hex to RGB r =int(hex_color[0:2], 16) g =int(hex_color[2:4], 16) b =int(hex_color[4:6], 16)# Return the RGBA colorreturnf"rgba({r}, {g}, {b}, {transparency})"def find_p_break(p_value: float, current_min_break:float, precision: int) ->float:if (p_value < current_min_break) and (p_value > current_min_break/10):return current_min_break, precisionelse:return find_p_break(p_value, current_min_break/10, precision+1)# Load dataset# Original from https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database (License: CC0: Public Domain)df = pd.read_csv("diabetes.csv")
Es befinden sich insgesamt 768 Einträge im Datensatz. Eine erste deskriptive Analyse ist in Tabelle 1 dargestellt. Der Datensatz enthält die Variablen:
Body-Mass-Index (BMI, \(\text{Gewicht in kg}/(\text{Größe in m})^2\))
Anzahl der Schwangerschaften
Alter
Glukosekonzentration im Plasma 2 Stunden nach einem oralen Glukosetoleranztest (mg/dl)
Blutdruck (mm Hg)
Hautdicke (Trizeps in mm)
Insulinkonzentration im Serum (mu U/ml)
Diabetes-Pedigree-Faktor (Funktion die das Diabetesrisiko aufgrund der Verwandtschaft bewertet)
Outcome (0 = kein Diabetes, 1 = Diabetes)
Code
df.describe().round(2)
Pregnancies
Glucose
BloodPressure
SkinThickness
Insulin
BMI
DiabetesPedigreeFunction
Age
Outcome
Loading ITables v2.2.4 from the init_notebook_mode cell...
(need help?)
Tabelle 1: Deskriptive Statistik des Datensatzes
In einigen Variablen befinden sich Nullwerte, die entsprechend der Ausschlusskriterien entfernt werden sollten, um eine korrekte Analyse durchzuführen.
Würde man alle Patientinnen mit Nullwerten in einer der Variablen entfernen, hätte man dadurch nur noch 392 Datensätze. Die primäre Forschungsfrage beschäftigt sich mit dem BMI. Teilnehmerinnen mit einem BMI von 0 wurden entfernt. Bei anderen Nullwerten wird der Median verwendet, um den Datensatz nicht übermäßig zu verkleinern.
Abbildung 1: Verteilung der kontinuierlichen Variablen nach Diabetes-Status
Einige Daten wurden in Gruppen eingeteilt, um die Analyse zu optimieren. Die Gruppen umfassen BMI-Kategorien (Tabelle 3), Anzahl der Schwangerschaften (Tabelle 4) und Alter (Tabelle 5).
Loading ITables v2.2.4 from the init_notebook_mode cell...
(need help?)
Tabelle 5: Gruppierung der Datensätze nach Altersgruppen
3.2 Statistische Analyse
3.2.1 Chi-Quadrat-Tests
Die Ergebnisse des Chi-Quadrat-Tests für die kategorialen Variablen BMI, Alter und Schwangerschaften sind in Tabelle 6 dargestellt. Alle Werte sind statistisch signifikant (\(p<0.05\)), was auf eine Assoziation mit dem Diabetes-Status hinweist. Die primär zu untersuchende Variable, der BMI, zeigt dabei die stärkste Assoziation. Eine weitere Untersuchung der Residuen des Chi-Quadrat-Tests (vgl. Tabelle 7) für die einzelnen Gruppierungen in BMI, Alter und Anzahl an Schwangerschaften zeigt einige signifikante Unterschiede zwischen den Gruppen. Jedoch sind nur in den Gruppen Untergewicht der BMI-Kategorie (welche keinen Diabetes-Fall aufweist) und den Gruppen 0 und 4-6 der Anzahl an Schwangerschaften keine statistisch signifikanten Residuen (\(<-2\) oder \(>2\)) zu erkennen.
Für die kontinuierlichen Variablen wurden t-Tests durchgeführt, um Unterschiede zwischen Diabetikerinnen und Nicht-Diabetikerinnen zu untersuchen. Die Ergebnisse sind in Tabelle 8 dargestellt. Die Variablen Glukose, BMI, Alter und Diabetes-Pedigree-Faktor zeigen signifikante Unterschiede zwischen den Gruppen (\(p<0.05\)).
Mittels logistischer Regression wurde der Zusammenhang zwischen BMI und Diabetes-Risiko untersucht (Abbildung 2). Die berechnete Odds Ratio für den BMI beträgt ≈1.11, was bedeutet, dass mit jedem Anstieg des BMI um einen Punkt das Diabetes-Risiko um 11% steigt. Das 95%-Konfidenzintervall für den Odds Ratio liegt zwischen ≈1.08 und ≈1.14. Die ROC-Kurve (Abbildung 3) und der AUC-Wert von ≈0.69 zeigen die moderate Diskriminierungsfähigkeit des BMI-basierten Modells.
Code
bmi_range = np.arange(df["BMI"].min(), df["BMI"].max(), 0.01)# Berechnung der Wahrscheinlichkeiten für den Bereich der BMI-Werteprobabilities =1/ (1+ np.exp(-(lr_result_bmi.params["const"] + lr_result_bmi.params["BMI"] * bmi_range)))# Calculate predictions for bmi_rangebmi_with_const = sm.add_constant(bmi_range)# Convert to numpy arrays for matrix operationsbmi_with_const_np = np.asarray(bmi_with_const)cov_matrix_np = np.asarray(lr_result_bmi.cov_params())# Calculate variance of the predictionsvar_predictions = np.einsum('ij,jk,ik->i', bmi_with_const_np, cov_matrix_np, bmi_with_const_np)# Compute standard errorsstd_errors = np.sqrt(var_predictions)# Calculate predictionsmean = lr_result_bmi.predict(bmi_with_const)# 95% Confidence Interval calculationz_value =1.96# for 95% confidence levelci_upper = mean + z_value * std_errorsci_lower = mean - z_value * std_errorsfig = go.Figure()fig.add_trace( go.Scatter( x=bmi_range, y=probabilities, mode="lines", name="Logistische Regression", line=dict(color=BENE_COLORS_LIGHT[0]), ))fig.add_trace( go.Scatter( x=np.concatenate([bmi_range, bmi_range[::-1]]), y=np.concatenate([ci_upper, ci_lower[::-1]]), fill='toself', hoverinfo="skip", name='95% CI', mode='none', fillcolor=set_transparency(BENE_COLORS_LIGHT[0], 0.25), ))fig.add_trace( go.Scatter( x=df["BMI"][df["Outcome"] ==1], y=df["Outcome"][df["Outcome"] ==1], mode="markers", name="Diabetes-Typ-2", marker_symbol="diamond", marker_size=5, line_color=set_transparency(BENE_COLORS_LIGHT[3], 0.5), ))fig.add_trace( go.Scatter( x=df["BMI"][df["Outcome"] ==0], y=df["Outcome"][df["Outcome"] ==0], mode="markers", name="kein Diabetes-Typ-2", marker_symbol="diamond", marker_size=5, line_color=set_transparency(BENE_COLORS_LIGHT[2], 0.5), ))fig.update_layout( xaxis_title="BMI", yaxis_title="Outcome", xaxis=dict(range=[df["BMI"].min(), df["BMI"].max()], constrain="domain", fixedrange=True),)fig.show()
Abbildung 2: Logistische Regressionskurve für BMI und Diabetes-Typ-2
Abbildung 3: ROC-Kurve für das BMI-basierte Modell
3.2.4 Odds Ratios für weitere kontinuierliche Variablen
Um die Odds Ratios für die weiteren kontinuierlichen Variablen zu berechnen und vergleichbar zu machen, wurden die Variablen standardisiert und die logistische Regression durchgeführt. Die Ergebnisse sind in Abbildung 4 dargestellt. Glukose zeigt den stärksten Zusammenhang mit Diabetes, gefolgt von BMI. Alle Variablen haben signifikante Odds-Ratios und Konfidenzintervalle (\(>1\)), die auf eine positive Korrelation zu Diabetes-Typ-2 hinweisen.
Code
# Berechnung der Odds Ratios auf standardisierten Variablendef calculate_odds_ratio_std(data: pd.DataFrame, var: str) ->tuple: data_std = data.copy() data_std[var] = (data_std[var] - data_std[var].mean()) / data_std[var].std() X = sm.add_constant(data_std[var]) model = sm.Logit(data_std["Outcome"], X).fit(disp=0) odds_ratio = np.exp(model.params[var]) conf_int = np.exp(model.conf_int().loc[var])return odds_ratio, conf_int[0], conf_int[1], model# Liste der Variablenvariables = ["BMI","Glucose","BloodPressure","SkinThickness","Insulin","DiabetesPedigreeFunction","Age",]# Berechnung der Odds Ratios mittels der Standardisierungodds_ratios = []lower_cis = []upper_cis = []for var in variables: or_value, ci_lower, ci_upper, _ = calculate_odds_ratio_std(df, var) odds_ratios.append(or_value) lower_cis.append(ci_lower) upper_cis.append(ci_upper)# Erstellung des Forest Plotsfig = go.Figure()# Vertikale Linie bei OR = 1fig.add_shape(type="line", x0=1, x1=1, y0=-1, y1=len(variables), line=dict(color="grey", dash="dash"),)# Odds Ratios und Konfidenzintervalle plottenfig.add_trace( go.Scatter( x=odds_ratios, y=variables, mode="markers", error_x=dict(type="data", symmetric=False, array=[up - or_val for up, or_val inzip(upper_cis, odds_ratios)], arrayminus=[or_val - low for low, or_val inzip(lower_cis, odds_ratios)], ), marker=dict(color=BENE_COLORS_LIGHT[0], size=8, symbol="diamond"), name="Odds Ratio (standardisiert)", ))fig.update_layout( xaxis_title="Odds Ratio (log scale)", yaxis_title="Variable", xaxis_type="log", showlegend=False,)fig.show()
Abbildung 4: Forest Plot der normalisierten Odds Ratios für kontinuierliche Variablen
4 Diskussion
4.1 Limitationen
Die vorliegende Analyse weist mehrere Limitationen auf, die bei der Interpretation der Ergebnisse berücksichtigt werden müssen. Zum einen verhindert das Querschnittsdesign jegliche kausale Schlussfolgerung. Da die Erhebung der Daten zu einem einzigen Zeitpunkt erfolgte, können Zusammenhänge zwischen Variablen nur als assoziativ betrachtet werden.
Ein weiterer wesentlicher Punkt ist der Selektionsbias. Die Ergebnisse basieren ausschließlich auf einer spezifischen Population von Pima-Indianerinnen, weshalb die Übertragbarkeit der Resultate auf andere Bevölkerungsgruppen oder geografische Regionen eingeschränkt sein könnte. Darüber hinaus könnte die Auswahl der Patientinnen selbst durch unterschiedliche Einschlusskriterien weiter verzerrt sein.
Die Datenqualität stellt ein zusätzliches Problem dar, da fehlende Werte mit dem Median imputiert wurden. Diese Methode verringert zwar die Anzahl fehlender Daten, könnte jedoch zu einer Unterschätzung oder Überschätzung der wahren Varianz der Messwerte führen. Hier wäre eine detailliertere Analyse der fehlenden Werte oder eine andere Imputationsmethode, wie z.B. Nearest Neighbors Imputation[2] sinnvoll.
Nicht zuletzt sind potenzielle Confounding-Faktoren, wie Ernährungsgewohnheiten und körperliche Aktivität, in der Analyse nicht berücksichtigt worden. Diese nicht erfassten Variablen könnten die beobachteten Zusammenhänge zwischen BMI, anderen Risikofaktoren und dem Diabetes-Risiko beeinflussen und sollten in zukünftigen Untersuchungen genauer untersucht werden.
4.2 Interpretation der Ergebnisse
Die Analyse bestätigt einen signifikanten Zusammenhang zwischen BMI und Diabetes-Typ-2 bei Pima-Indianerinnen, weshalb die Nullhypothese verworfen werden kann. Neben dem BMI zeigen die deskriptiven Statistiken, Chi‑Quadrat-Tests und t‑Tests, dass auch andere Variablen wie Glukose, Alter, Blutdruck und der Diabetes-Pedigree-Faktor wichtige Prädiktoren für das Diabetes-Risiko darstellen könnten. Insbesondere der Glukose-Wert ist aber wahrschinlich eine Folge des Diabetes und nicht ein Prädiktor.
Insbesondere weisen die Chi‑Quadrat-Tests darauf hin, dass die Kategorisierung von BMI, Altersgruppen und Schwangerschaftszahlen statistisch signifikante Unterschiede zwischen Diabetikerinnen und Nicht-Diabetikerinnen offenbart. Die t‑Tests bestätigen signifikante Differenzen in den Mittelwerten kontinuierlicher Variablen zwischen den Variablen.
Die logistische Regression liefert einen quantitativen Zusammenhang: Mit jedem Punktanstieg des BMI steigt das Risiko für Diabetes signifikant an, was durch den berechneten Odds Ratio untermauert wird. Zudem zeigt die ROC-Analyse des BMI-basierten Modells eine moderate Diskriminierungsfähigkeit, und der Forest Plot der standardisierten Odds Ratios verdeutlicht, dass insbesondere hohe Glukosewerte den stärksten Zusammenhang zu Diabetes-Typ-2 haben, während auch andere Variablen ihre Relevanz besitzen.
Eine weiterführende multivariate Analyse könnte zudem die komplexen Interaktionen zwischen den einzelnen Risikofaktoren detaillierter beleuchten.