Hier ist eine vereinfachte Version meines Codes:
Code: Select all
import numpy as np
import pandas as pd
# Define the time points and variables
time_points = [6,12]
variables = ['var1', 'var2']
# Initialize dictionaries for odds ratios and confidence intervals
odds_ratios = {var: [] for var in variables}
conf_intervals = {var: [] for var in variables}
# Create a DataFrame for time points and generate spline terms (function not shown)
all_times = pd.DataFrame({'Time': time_points})
all_spline_terms = create_spline_terms(all_times, column='Time', num_knots=6)
# Loop through time points
for time in time_points:
base_data = data.copy()
base_data['Time'] = time
for col in all_spline_terms.columns:
base_data[col] = all_spline_terms.loc[all_times['Time'] == time, col].values[0]
for var in variables:
# Predict probabilities for var = 1 and var = 0
base_data_var_1 = base_data.copy()
base_data_var_1[var] = 1
proba_1 = result.predict(base_data_var_1)
odds_1 = proba_1 / (1 - proba_1)
base_data_var_0 = base_data.copy()
base_data_var_0[var] = 0
proba_0 = result.predict(base_data_var_0)
odds_0 = proba_0 / (1 - proba_0)
# Calculate the odds ratio
odds_ratio = odds_1.mean() / odds_0.mean() if odds_0.mean() != 0 else np.nan
odds_ratios[var].append(odds_ratio)
# Calculate Wald 95% confidence intervals
coef_var = result.params[var]
std_error_var = result.bse[var]
interaction_coef = 0
interaction_var = 0
for col in all_spline_terms.columns:
interaction_term = f"{var}:{col}"
if interaction_term in result.params:
interaction_coef += result.params[interaction_term]
interaction_var += result.bse[interaction_term] ** 2
total_coef = coef_var + interaction_coef
total_std_error = np.sqrt(std_error_var ** 2 + interaction_var)
lower_ci_log = total_coef - 1.96 * total_std_error
upper_ci_log = total_coef + 1.96 * total_std_error
lower_ci = np.exp(lower_ci_log)
upper_ci = np.exp(upper_ci_log)
conf_intervals[var].append((lower_ci, upper_ci))
# Output results
for var in variables:
print(f"\nOdds ratios and 95% CI for {var}:")
for time, odds_ratio, (lower_ci, upper_ci) in zip(time_points, odds_ratios[var], conf_intervals[var]):
print(f' At time {time}: Odds ratio = {odds_ratio:.4f}, 95% CI = ({lower_ci:.4f}, {upper_ci:.4f})')
Code: Select all
def create_spline_terms(df, column='Time', num_knots=6, degree=3):
knots = np.linspace(df[column].min(), df[column].max(), num_knots + 2)[1:-1]
spline_terms = patsy.dmatrix(
f"cr({column}, knots={list(knots)}, constraints='center')",
df,
return_type='dataframe'
)
return spline_terms.iloc[:, 1:]
Die Quotenverhältnisse werden korrekt berechnet, aber die Konfidenzintervalle zeigen nicht die erwarteten Werte an. Ich vermute, dass das Problem darin liegt, wie ich die Gesamtkoeffizienten oder Standardfehler berechne, insbesondere beim Summieren von Interaktionstermen.
Spezifische Fragen:
- Gibt es einen Fehler bei der Berechnung der Konfidenzintervalle?
- Wie kann ich sicherstellen, dass die Interaktionsterme in den Konfidenzintervallberechnungen korrekt berücksichtigt werden?
- Gibt es Best Practices dafür? Berechnen von Quotenverhältnissen und Konfidenzintervallen in der logistischen Regression, die ich möglicherweise übersehen habe?
Ich habe eine Schleife implementiert, um die Quotenverhältnisse und ihre entsprechenden Konfidenzintervalle für mehrere Variablen zu verschiedenen Zeitpunkten zu berechnen. Ich stellte sicher, dass die Interaktionsterme jeder Variablen korrekt in die CI-Berechnungen einbezogen wurden, indem ich die Koeffizienten und ihre Varianzen summierte.
Was ich erwartet hatte:
Ich erwartete für jede Variable zu jedem Zeitpunkt unterschiedliche Konfidenzintervalle, die die einzigartigen Beziehungen und Varianzen an diesen spezifischen Punkten widerspiegelten. Die Ausgabe sollte für jede Variable zu jedem Zeitpunkt ein eindeutiges CI liefern, aber die aktuelle Implementierung scheint falsche oder identische Konfidenzintervalle über Variablen und Zeitpunkte hinweg zu erzeugen.
Mobile version