适用于许多回归模型的循环



我有一个看起来像这样的数据库。种族、年龄和保险变量是分类的,症状和Covid_pos变量是[0/1]。

ID   RACE_GROUP_N Age_Group_N... Covid_pos  Asymptomatic  Fever  Cough ...
0     1               0            1             0        1      0
1     0               2            0             0        0      1
2     3               3            1             1        0      0
3     2               1            1             0        1      0
4     3               2            0             1        0      0
5     0               4            1             0        1      0

我想为每个症状变量运行单独的回归模型,包括分类变量,年龄,种族和保险。每个症状的每次回归都是相同的;例如,目前的回归模型是这样的:

asy_model = smf.logit("Covid_pos ~  Asymptomatic  + C(RACE_GROUP_N, Treatment(0))+ C(Age_Group_N, Treatment(0))+C(Insurance_Type_Group, Treatment(0))",
data = df_merged2).fit()
asy_model_odds = pd.DataFrame(np.exp(asy_model.params), columns= ['OR'])
asy_model_odds['z-value']= asy_model.pvalues
asy_model_odds[['2.5%', '97.5%']] = np.exp(asy_model.conf_int())
asy_model_odds
fev_model = smf.logit("Covid_pos ~  Fever+ C(RACE_GROUP_N, Treatment(0))+ C(Age_Group_N, Treatment(0))+C(Insurance_Type_Group, Treatment(0))",
data = df_merged2).fit()
fev_model_odds = pd.DataFrame(np.exp(fev_model .params), columns= ['OR'])
fev_model_odds ['z-value']= fev_model .pvalues
fev_model_odds [['2.5%', '97.5%']] = np.exp(fev_model .conf_int())
fev_model_odds

问题语句1:我想创建一个for循环,这样我就不必为每个症状变量写15次以上的代码。

问题语句2:我希望for循环的输出用OR和95%CI来表示结果。就像这样。

Symptom            Odds Ratio   LCB   UCB 
Asymptomatic      2.607       1.981 3.430
Fever             1.899       1.226 2.941  

不确定为什么要分离症状并运行单独的回归(因为logit回归的目的正是确定所有特征/症状的重要性(。

不管怎样,你可以用的名字和型号建立一个字典

all_models = {'name1': model_object1, 'name2': ... }

然后循环将是

all_odds = dict()
for model_name, model in all_models.items():
odds = pd.DataFrame(np.exp(model.params), columns=['OR'])
odds['z-value'] = model.pvalues
odds[['2.5%', '97.5%']] = np.exp(model.conf_int())
all_odds['model_name'] = odds

最后,您可以像使用任何字典一样访问每个单独赔率的赔率,或者您可以构建一个主数据帧

all_odds = pd.concat(all_odds.values(), keys=all_odds.keys())

更新

我不记得statsmodels的语法,但要填充all_models字典,可以使用之类的东西

all_models = dict()
all_models['asymptomatic'] = smf.logit(...).fit()
all_models['fever'] = smf.logit(...).fit()

最新更新