任务:利用cox筛选出P值小于0.05的特征
数据的格式第一列为标签,第二列为时间,第三列及后为特征
先想一想,想好了再更新
这里我们先举一个例子:
import pandas as pd
from lifelines import CoxPHFitter
# 创建示例数据集
data = pd.DataFrame({
'age': [25, 35, 45, 55, 65],
'pressure': [5, 4, 2, 1, 1], # 男性和女性的数量
'white': [7, 4, 6, 4, 3], # 吸烟和不吸烟的数量
'time': [5, 10, 15, 20, 25], # 时间至事件发生或观察截止的时间
'event': [1, 0, 1, 0, 1] # 1表示事件发生,0表示事件未发生
})
# 创建 Cox 比例风险模型
cph = CoxPHFitter()
# 拟合模型
cph.fit(data, duration_col='time', event_col='event')
# 获取结果
cph.print_summary()
这里我们和SPSS中进行一下对比:
结果是不一样的,我也不知道为什么,等我再使用R语言试试。
那么就进入今天的任务
先检查一下多重共线性
import pandas as pd
# 加载数据集
data = pd.read_excel(r"C:\Users\Administrator\Desktop\COX_data.xlsx")
# 计算特征之间的相关系数
correlation_matrix = data.corr()
# 打印相关系数矩阵
print("特征之间的相关系数矩阵:")
print(correlation_matrix)
# 选择性排除高度相关的特征
# 假设阈值为0.7,如果相关系数绝对值大于等于0.7,则认为特征高度相关
highly_correlated_features = set()
threshold = 0.7
for i in range(len(correlation_matrix.columns)):
for j in range(i):
if abs(correlation_matrix.iloc[i, j]) >= threshold:
colname = correlation_matrix.columns[i]
highly_correlated_features.add(colname)
# 打印高度相关的特征
print("\n高度相关的特征:")
print(highly_correlated_features)
删除掉共线性的特征
# 移除高度相关的特征
data = data.drop(columns=highly_correlated_features)
# 创建并拟合 Cox 回归模型
coxph = CoxPHFitter()
coxph.fit(data, duration_col='time', event_col='label')
# 计算 p 值
p_values = coxph._compute_p_values()
p_values_df = pd.DataFrame(p_values, index=data.columns[2:], columns=['p'])
# 筛选出 p 值小于 0.05 的特征
significant_features = p_values_df[p_values_df['p'] > 0.05] # 注意修改这里的筛选条件
# 打印筛选结果
print("\nP 值小于 0.05 的特征:")
print(significant_features)
设置一个路径,保存数据
# 获取符合条件的特征名
significant_feature_names = significant_features.index.tolist()
# 保存符合条件的特征数据到新的 CSV 文件
significant_features_data = data[['time', 'label'] + significant_feature_names]
significant_features_data.to_csv(r"C:\Users\Administrator\Desktop\significant_features_data.csv", index=False)