Вот упрощенная версия моего кода:
Код: Выделить всё
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})')
Код: Выделить всё
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:]
Отношения шансов рассчитываются правильно, но доверительные интервалы не отображают ожидаемые значения. Я подозреваю, что проблема может заключаться в том, как я рассчитываю общие коэффициенты или стандартные ошибки, особенно при суммировании условий взаимодействия.
Конкретные вопросы:
- Есть ли ошибка в расчете доверительных интервалов?
- Как я могу гарантировать, что условия взаимодействия правильно учитываются при расчете доверительных интервалов?
- Существуют ли какие-либо передовые методы расчета отношения шансов и доверительные интервалы в логистической регрессии, которые я мог упустить из виду?
Я реализовал цикл для расчета отношений шансов и соответствующих им доверительных интервалов для нескольких переменных в разные моменты времени. Я гарантировал, что условия взаимодействия каждой переменной были правильно включены в расчеты CI, суммируя коэффициенты и их дисперсии.
Чего я ожидал:
Я ожидал разных доверительных интервалов для каждой переменной в каждый момент времени, отражающих уникальные взаимосвязи и дисперсии в этих конкретных точках. Выходные данные должны обеспечивать отдельный CI для каждой переменной в каждый момент времени, но текущая реализация, похоже, создает неправильные или идентичные доверительные интервалы для переменных и моментов времени.
Подробнее здесь: https://stackoverflow.com/questions/790 ... dds-ratios
Мобильная версия