条件Logistic回归分析(Conditional Logistic Regression Analysis)——Python软件实现

发布于 2023年5月5日 星期五 20:41:50 浏览:1312
原创不易,转载请注明来源,感谢!
附件下载:
条件Logistic回归.csv 请勿重复点击,如无响应请耐心等待或稍后再试。

在前面文章中介绍了条件logistic回归分析(Conditional Logistic Regression Analysis)的假设检验理论,本篇文章将实例演示在Python软件中实现条件logistic回归分析的操作步骤。

关键词:Python; 条件logistic回归; 配对logistic回归; 条件逻辑回归; 配对逻辑回归

一、案例介绍

某肾内科医师拟探究急性肾损伤的危险因素,回顾性收集了109例在院内发生急性肾损伤患者的性别(gender)、年龄(age)、体质指数(BMI)、血肌酐(Cr)和血清乳酸(Serum Lactate),并根据性别和年龄进行1:1配对,收集了109例未发生肾损伤患者的相关信息,进行配对病例对照研究。“sAKI”为二分类变量,代表急性肾损伤发生情况(“发生”记录为“1”,“未发生”记录为“0”);“BMI”为有序多分类变量,代表体质指数(“偏瘦”为“1”,“中等”为“2”,“超重”为“3”);“Cr”和“Lactate”都为连续变量,分别表示血肌酐和血清乳酸含量;“subclass”表示对子数。部分数据见图1。本案例数据可从“附件下载”处下载。

二、问题分析

本案例的分析目的是探讨急性肾损伤的危险因素,采用配对设计,研究多个因素对二分类因变量的影响,可以采用条件logistic回归分析。但需要满足7个条件:

条件1:因变量为二分类变量。本研究中因变量为是否发生急性肾损伤,“是”和“否”为二分类变量,该条件满足。

条件2:至少有1个自变量。自变量可以是分类变量也可以是连续变量。本研究中有多个自变量,类型各异,该条件满足。

条件3:观察变量为配对设计或具有相关性,即不满足独立性。本研究中,两组患者是根据性别和年龄进行1:1配对,因此属于相关样本,不满足独立性,该条件满足。

条件4:因变量对子数为自变量个数的10~15倍(EPV原则),最好>30对,自变量的参照水平组不应少于30或50例。该条件需要通过软件分析后判断。

条件5:自变量之间无多重共线性。该条件需要通过软件分析后判断。

条件6:自变量不存在显著的异常值。该条件需要通过软件分析后判断。

条件7:数据未出现完全分离或拟完全分离现象。该条件需要通过软件分析后判断。

三、软件操作及结果解读

(一) 导入数据

import pandas as pd
df = pd.read_csv(‘条件logistic回归.csv’)  #导入CSV数据
df #查看数据
图1

在数据栏目中可以查看全部数据情况,数据集中共有7个变量和218个观察数据,7个变量分别为急性肾损伤(sAKI)、性别(Gender)、年龄(Age)、体质指数(BMI)、血肌酐(Cr)、血清乳酸(Lactate)及对子数(subclass)。

如果数据集较大也可使用如下命令查看数据框结构,结果见图2。

df.info()  #查看数据框结构
图2

(二) 适用条件判断

1. 条件4判断(因变量样本例数)

(1) 软件操作

##预后变量计数##

a = df.value_counts(subset='sAKI') #计算样本数
a
图3
(2) 结果解读

样本计算结果(图3)显示,“1”代表“发生急性肾损伤”,“0”代表“未发生急性肾损伤”,两组均为109例,即109对。根据“因变量对子数为自变量个数的10~15倍(EPV原则)”,本案例可纳入7~11个自变量进行多因素条件logistic回归分析。

2. 条件4判断(自变量样本例数)

为了增加结果的可读性,给部分分类变量增加标签,之后再逐一计算分类变量各类别的因变量例数。

(1) 软件操作

##给变量添加标签label ##

df2 = df.copy()
df2.loc[df['Gender']==1,'Gender']='男'
df2.loc[df['Gender']==0,'Gender']='女'
df2.loc[df['BMI']==3,'BMI']='超重'
df2.loc[df['BMI']==2,'BMI']='中等'
df2.loc[df['BMI']==1,'BMI']='偏瘦'
df2
图4

##变量计数##

Gs = df2.value_counts(subset= ['Gender','sAKI'])
print(Gs)
Bs = df2.value_counts(subset=['BMI','sAKI'])
print(Bs)
图5

##创建哑变量##

因为分类变量无法直接放入模型,这里需要对其进行转换,而回归模型中对分类变量最常用的处理方法之一便是将其转化成虚拟变量(设置哑变量)。在Python中可通过删除参照水平设置哑变量。

df = pd.get_dummies(df,columns = ['BMI'])
df.drop('BMI_3',axis = 1,inplace=True) #通过删除BMI超重水平,将其设置为参考变量
df
图6
(2) 结果解读

增加标签后结果(图5)显示,“BMI”水平为“1”偏瘦时,因变量的例数<30,如果该变量在多因素分析过程中进入模型,应注意避免例数较少的水平被选为参照。

3. 条件5判断(多重共线性诊断)

详见本章后文。

4. 条件6判断(异常值检测)

(1) 软件操作

##异常值检验-cook距离##

import statsmodels.api as sm
x = sm.add_constant(df.loc[:,['BMI_1','BMI_2','Cr','Lactate']]) #生成自变量
y = df['sAKI'] #生成因变量
model = sm.GLM(y, x.astype(float),family=sm.families.Binomial())
lmreg = model.fit() #模型拟合
infl = lmreg.get_influence()
cook_d = infl.cooks_distance[0]
print(max(cook_d))
图7
(2) 结果解读

使用库克距离(Cook’s distance)来判断强影响点是否为因变量的异常值点。一般认为当D<0.5时不是异常值点,当D>0.5时认为是异常值点。库克距离结果(图7)显示,本案例最大库克距离为0.354<0.5,提示不存在显著异常值,本研究数据满足条件6。

5. 条件7判断(完全分离检测)

完全分离,指某一个自变量本身或者某几个自变量的线性组合,对因变量的预测结果与实际情况完全一致,常表现为OR值无穷大。通过图6可见并不存在这种情况。该条件满足。

(三) 条件logistic回归分析

1. 软件操作

##建立包含所有自变量的条件logistic回归模型##

条件logistic分析:

from statsmodels.discrete.conditional_models import ConditionalLogit
x = df.loc[:,['BMI_1','BMI_2','Cr','Lactate']] #生成自变量
y = df['sAKI'] #生成因变量
g = df['subclass']
model = ConditionalLogit(endog=y,exog=x,groups=g)
clogit = model.fit() #模型拟合
clogit.summary()
图8
import numpy as np
clogit.params.apply(lambda x: np.e**x)  #计算OR值
图9
clogit.conf_int().applymap(lambda x: np.e**x)  #计算OR值置信区间
图10

2. 结果解读

BMI偏瘦的OR=0.201 (95%CI:0.060~0.680, P=0.010),说明偏瘦发生急性肾损伤的风险约为超重的0.201倍(将0.201取倒数,即为超重组发生急性肾损伤的风险约为偏瘦组的4.98倍);BMI中等的OR=0.690 (95%CI:0.290~1.641, P=0.401>0.05),说明BMI中等相比BMI超重的患者,急性肾损伤风险未发生明显变化。Cr组和Lacate组的OR值分别为1.011 (95%CI:1.006~1.017, P<0.001)和1.169 (95%CI:1.029~1.329, P=0.017),均大于1,说明急性肾损伤风险随着Cr和Lacate的增高而增加,Cr每升高一个单位,发生急性肾损伤的风险增加1.1%;Lacate每升高一个单位,发生急性肾损伤的风险增加16.9%。

(四) 适用条件判断(补充条件5判断:多重共线性诊断)

1. 软件操作

##共线性诊断##

from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = [variance_inflation_factor(df.drop(['sAKI','Age','Gender'],axis = 1), i) for i in range(df.drop(['sAKI','Age','Gender'],axis = 1).shape[1])]
pd.DataFrame(data = zip(df.drop(['sAKI','Age','Gender'],axis = 1),vif),columns = ['变量','vif'])
图11

2. 结果解读

多重共线性诊断结果(图11)中计算了自变量的方差膨胀因子(variance inflation factor,VIF)。可见,所有自变量的VIF均<10,提示自变量之间不存在严重共线性问题。满足条件5。

四、结论

本研究采用条件logistic回归模型探讨发生急性肾损伤的危险因素。通过分析可知因变量对子数和自变量个数满足需求,变量之间不存在严重共线性和异常值,数据不存在完全分离现象。满足条件logistic回归分析条件。

条件logistic回归分析结果提示,所建立的模型有统计学意义(χ²=66.30,P<0.001)。三个自变量经过分析后发现均有统计学意义,其中BMI偏瘦发生急性肾损伤的风险是超重的0.201倍 (95%CI:0.060~0.680, P=0.010);急性肾损伤风险随着Cr的升高而增加,Cr每升高一个单位发生风险增加1.1% (95%CI:0.006~0.017;P<0.001);急性肾损伤风险随着Lacate的升高而增加,Lacate每升高一个单位发生风险增加16.9% (95%CI:0.029~0.329, P=0.017)。

End
文章目录 沉浸式阅读