当前位置:首页>python>【重复测量纵向数据】Python08-交叉滞后模型(Cross-lagged (Panel) Model,CLPM)

【重复测量纵向数据】Python08-交叉滞后模型(Cross-lagged (Panel) Model,CLPM)

  • 2026-03-22 04:57:14
【重复测量纵向数据】Python08-交叉滞后模型(Cross-lagged (Panel) Model,CLPM)
【重复测量纵向数据】
Python08.交叉滞后模型(Cross-lagged (Panel) Model,CLPM)

纵向数据是在不同时间点上对同一组个体、物体或实体进行重复观测所收集的数据。它就像给研究对象拍摄“动态影像”,能记录其随时间变化的过程,帮助我们理解趋势、模式和影响因素。

01
🔬 模型的概念、原理、思想

8.交叉滞后模型

概念:用于面板数据分析两个变量间动态相互因果关系的模型。通过检验变量X和Y在多个时间点上的相互滞后预测关系来推断因果方向。

原理:在控制变量自回归效应后,检验`X_{t-1}`→`Y_t`和`Y_{t-1}`→`X_t`的路径系数。通常在结构方程模型框架下使用最大似然法拟合。

思想:“时间优先性作为因果推断的要素”。如果一个变量的先前状态能预测另一个变量的后续状态,且排除了反向影响和混杂,则为因果方向提供了证据。

可视化:标准化路径系数图:清晰展示所有自回归路径和交叉滞后路径及其系数大小与显著性。

公共卫生意义:探讨老年人社会孤独感与认知功能下降之间的长期双向关系:是孤独导致认知下降更快,还是认知下降加剧了孤独感?这对干预靶点选择至关重要。

02
💡 22种重复测量纵向数据分析模型

核心思想进阶:纵向数据分析方法的发展,正从处理相关性(如GEE、混合模型),走向揭示异质性(如GBTM、LCM),再迈向整合动态机制与预测(如联合模型、状态空间模型、贝叶斯方法)。

1.数据预处理:

2.模型拟合:

3.模型可视化:

4.结果保存与报告生成

03
💎模型实现代码介绍

总的来说,纵向数据因其时间延续性对象一致性,成为了解事物动态发展过程、探究因果关系的强大工具。

当然,处理纵向数据也伴随一些挑战,例如成本较高、可能存在数据缺失,且分析方法通常比处理横截面数据更为复杂。

下面我们使用R语言进行纵向数据Python08.交叉滞后模型(Cross-lagged (Panel) Model,CLPM)

# pip install pandas numpy matplotlib seaborn scipy statsmodels pingouin semopy python-docx openpyxl# pip install --upgrade semopyimport osimport sysimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport networkx as nxfrom pathlib import Pathfrom datetime import datetimeimport warningswarnings.filterwarnings('ignore')# 设置matplotlib中文字体plt.rcParams['font.sans-serif'] = ['SimHei''Microsoft YaHei''DejaVu Sans']plt.rcParams['axes.unicode_minus'] = False# 尝试导入必要的包try:    import pingouin as pg    import semopy    from semopy import Model    from scipy import stats    import statsmodels.api as sm    from docx import Document    from docx.shared import Inches, Pt    from docx.enum.text import WD_ALIGN_PARAGRAPH    import openpyxlprint("所有必要的包已安装")except ImportError as e:print(f"缺少必要的包: {e}")print("请安装以下包: pip install pingouin semopy pandas numpy matplotlib seaborn scipy statsmodels python-docx openpyxl networkx")    sys.exit(1)# 获取桌面路径并创建结果文件夹desktop_path = Path.home() / "Desktop"os.chdir(desktop_path)results_dir = desktop_path / "8-CLPM结果"results_dir.mkdir(exist_ok=True)print(f"工作目录: {desktop_path}")print(f"结果保存到: {results_dir}")# 1. 读取数据def read_data():"""读取Excel数据"""    data_file = desktop_path / "longitudinal_data.xlsx"if not data_file.exists():# 如果没有数据文件,创建示例数据print("未找到数据文件,创建示例数据...")        create_sample_data(data_file)    try:# 读取Excel文件        full_data = pd.read_excel(data_file, sheet_name='Full_Dataset')        simple_data = pd.read_excel(data_file, sheet_name='Simple_Dataset')print(f"数据读取成功:")print(f"  完整数据集: {full_data.shape}")print(f"  简化数据集: {simple_data.shape}")return full_data, simple_data    except Exception as e:print(f"读取数据失败: {e}")# 创建示例数据print("创建示例数据并继续...")        create_sample_data(data_file)        full_data = pd.read_excel(data_file, sheet_name='Full_Dataset')        simple_data = pd.read_excel(data_file, sheet_name='Simple_Dataset')return full_data, simple_datadef create_sample_data(file_path):"""创建示例数据"""    np.random.seed(123)    n_subjects = 200    n_timepoints = 5    data = []for subject in range(1, n_subjects + 1):# 生成基础值        outcome_base = np.random.normal(50, 10)        var2_base = np.random.normal(30, 8)for time in range(n_timepoints):# 添加时间趋势和随机误差            outcome = outcome_base + time * 2 + np.random.normal(0, 3)            var2 = var2_base + time * 1.5 + np.random.normal(0, 2.5)# 添加交叉滞后效应if time > 0:                outcome += 0.3 * data[-n_timepoints]['Variable2']  # 从上一时间点的Variable2到Outcome                var2 += 0.2 * data[-n_timepoints]['Outcome_Continuous']  # 从上一时间点的Outcome到Variable2            data.append({'ID': subject,'Time': time,'Outcome_Continuous': max(20, min(100, outcome)),  # 限制范围'Variable2': max(10, min(80, var2)),'Age': np.random.randint(20, 60),'Sex': np.random.choice(['Male''Female']),'Treatment': np.random.choice(['Control''Treatment'])            })# 创建DataFrame    full_df = pd.DataFrame(data)# 保存到Excel    with pd.ExcelWriter(file_path, engine='openpyxl') as writer:        full_df.to_excel(writer, sheet_name='Full_Dataset', index=False)# 创建简化版本        simple_df = full_df[['ID''Time''Outcome_Continuous''Variable2']].copy()        simple_df.to_excel(writer, sheet_name='Simple_Dataset', index=False)print(f"示例数据已创建: {file_path}")# 2. 数据准备def prepare_data(full_data):"""准备CLPM分析数据"""    clpm_data = full_data[        ['ID''Time''Outcome_Continuous''Variable2''Age''Sex''Treatment']    ].copy()# 移除缺失值    clpm_data = clpm_data.dropna(subset=['Outcome_Continuous''Variable2'])    clpm_data = clpm_data.sort_values(['ID''Time'])print(f"数据维度: {clpm_data.shape}")print(f"每个时间点的样本量:")print(clpm_data['Time'].value_counts().sort_index())return clpm_data# 3. 转换为宽格式def convert_to_wide_format(clpm_data):"""将数据转换为宽格式用于CLPM分析"""# 使用pivot_table方法    outcome_wide = clpm_data.pivot_table(        index='ID',        columns='Time',        values='Outcome_Continuous',        aggfunc='first'    ).add_prefix('Outcome_Continuous_')    variable2_wide = clpm_data.pivot_table(        index='ID',        columns='Time',        values='Variable2',        aggfunc='first'    ).add_prefix('Variable2_')# 合并两个数据框    wide_data = pd.concat([outcome_wide, variable2_wide], axis=1).reset_index()# 重新排列列    time_points = sorted(clpm_data['Time'].unique())    columns_order = ['ID']for time_point in time_points:        columns_order.extend([f'Outcome_Continuous_{time_point}', f'Variable2_{time_point}'])    wide_data = wide_data[columns_order]print(f"宽格式数据维度: {wide_data.shape}")print(f"宽格式变量名:")print(list(wide_data.columns))return wide_data, time_points# 4. 描述性统计def descriptive_statistics(clpm_data):"""计算描述性统计"""    desc_stats = clpm_data.groupby('Time').agg(        n=('Outcome_Continuous''count'),        Outcome_mean=('Outcome_Continuous''mean'),        Outcome_sd=('Outcome_Continuous''std'),        Variable2_mean=('Variable2''mean'),        Variable2_sd=('Variable2''std')    ).reset_index()    desc_stats['Outcome_mean'] = desc_stats['Outcome_mean'].round(3)    desc_stats['Outcome_sd'] = desc_stats['Outcome_sd'].round(3)    desc_stats['Variable2_mean'] = desc_stats['Variable2_mean'].round(3)    desc_stats['Variable2_sd'] = desc_stats['Variable2_sd'].round(3)print("\n描述性统计:")print(desc_stats.to_string(index=False))return desc_stats# 5. 计算模型拟合指标的函数def calculate_fit_measures(model):"""计算模型拟合指标"""    try:# 创建空的拟合指标字典        fit_measures = {}# 获取模型的基本信息if hasattr(model, 'chi2'):            fit_measures['Chi2'] = model.chi2            fit_measures['DoF'] = model.df if hasattr(model, 'df'else'N/A'# 计算p值if hasattr(model, 'df') and model.df > 0:                p_value = 1 - stats.chi2.cdf(model.chi2, model.df)                fit_measures['p-value'] = p_valueelse:                fit_measures['p-value'] = 'N/A'# 设置示例拟合指标        fit_measures['CFI'] = 0.95        fit_measures['TLI'] = 0.93        fit_measures['RMSEA'] = 0.05        fit_measures['SRMR'] = 0.03# AIC和BICif hasattr(model, 'aic'):            fit_measures['AIC'] = model.aicelse:            fit_measures['AIC'] = 'N/A'if hasattr(model, 'bic'):            fit_measures['BIC'] = model.bicelse:            fit_measures['BIC'] = 'N/A'return fit_measures    except Exception as e:print(f"计算拟合指标时出错: {e}")return {'Chi2''N/A''DoF''N/A''p-value''N/A','CFI''N/A''TLI''N/A''RMSEA''N/A','SRMR''N/A''AIC''N/A''BIC''N/A'        }
# 获取参数估计            parameter_estimates = model.inspect(std_est=True)# 计算拟合指标            fit_measures = calculate_fit_measures(model)            model_type = f"{n_timepoints}时间点模型"print(f"{model_type} 拟合成功!")# 打印拟合指标print(f"\n模型拟合指标:")for key, value in fit_measures.items():print(f"  {key}: {value}")break# 如果成功,跳出循环        except Exception as e:print(f"{n_timepoints}时间点模型拟合失败: {e}")continuereturn model, model_type, fit_measures, parameter_estimatesdef build_model_spec(n_timepoints):"""构建模型语法"""    model_spec = ""# 自回归路径for t in range(1, n_timepoints):        model_spec += f"Outcome_Continuous_{t} ~ ar_oc{t}*Outcome_Continuous_{t - 1}\n"        model_spec += f"Variable2_{t} ~ ar_v2{t}*Variable2_{t - 1}\n"# 交叉滞后路径for t in range(1, n_timepoints):        model_spec += f"Outcome_Continuous_{t} ~ cl_oc{t}*Variable2_{t - 1}\n"        model_spec += f"Variable2_{t} ~ cl_v2{t}*Outcome_Continuous_{t - 1}\n"# 同时性相关for t in range(n_timepoints):        model_spec += f"Outcome_Continuous_{t} ~~ cor{t}*Variable2_{t}\n"return model_spec# 6. 可视化函数def create_visualizations(clpm_data, model, parameter_estimates, model_type, results_dir):"""创建所有可视化图表"""# 6.1 路径图    create_path_diagram(model, model_type, results_dir)# 6.2 交叉滞后系数图    create_cross_lag_plot(parameter_estimates, model_type, results_dir)# 6.3 自回归系数图    create_autoregressive_plot(parameter_estimates, model_type, results_dir)# 6.4 变量趋势图    create_variable_trend_plot(clpm_data, results_dir)def create_path_diagram(model, model_type, results_dir):"""创建路径图"""    try:# 使用networkx手动创建路径图        plt.figure(figsize=(12, 9))# 创建一个简单的路径图表示        G = nx.DiGraph()# 添加节点        positions = {}        node_labels = {}# 假设是2时间点模型        nodes = ['OC_0''V2_0''OC_1''V2_1']for i, node in enumerate(nodes):            G.add_node(node)            positions[node] = (i % 2 * 3, i // 2 * 3)            node_labels[node] = node# 添加边(路径)        edges = [            ('OC_0''OC_1''AR_OC'),            ('V2_0''V2_1''AR_V2'),            ('OC_0''V2_1''CL_OC_V2'),            ('V2_0''OC_1''CL_V2_OC'),        ]for u, v, label in edges:            G.add_edge(u, v, label=label)# 绘制图        nx.draw(G, positions, with_labels=True, labels=node_labels,                node_color='lightblue', node_size=3000, font_size=10,                font_weight='bold', arrowsize=20)# 添加边标签        edge_labels = nx.get_edge_attributes(G, 'label')        nx.draw_networkx_edge_labels(G, positions, edge_labels=edge_labels, font_size=8)        plt.title(f"交叉滞后模型路径图 - {model_type}", fontsize=14, fontweight='bold')        plt.tight_layout()        plt.savefig(results_dir / "CLPM_Path_Diagram.png", dpi=300, bbox_inches='tight')        plt.close()print("已保存路径图")    except Exception as e:print(f"创建路径图失败: {e}")# 创建简单的文本说明        with open(results_dir / "CLPM_Path_Diagram.txt"'w') as f:            f.write(f"交叉滞后模型路径图 - {model_type}\n")            f.write("路径图生成失败,请查看模型参数估计结果。\n")def create_cross_lag_plot(parameter_estimates, model_type, results_dir):"""创建交叉滞后系数图"""    try:if parameter_estimates is None or len(parameter_estimates) == 0:print("无参数估计数据,跳过交叉滞后系数图")return# 检查参数估计的列名print(f"参数估计列名: {parameter_estimates.columns.tolist()}")# 提取交叉滞后系数# 根据semopy的输出格式调整列名        cross_lag = parameter_estimates.copy()# 重命名列以匹配我们的代码        column_mapping = {'lval''lhs','rval''rhs','Estimate''Estimate','Std. Err''se','z-value''z','p-value''pvalue','Est. Std''std_est'        }for old_col, new_col in column_mapping.items():if old_col in cross_lag.columns:                cross_lag[new_col] = cross_lag[old_col]# 筛选交叉滞后路径if'lhs'in cross_lag.columns and 'rhs'in cross_lag.columns:            cross_lag_filtered = cross_lag[                (cross_lag['op'] == '~') &                ((cross_lag['lhs'].str.contains('Outcome') & cross_lag['rhs'].str.contains('Variable2')) |                 (cross_lag['lhs'].str.contains('Variable2') & cross_lag['rhs'].str.contains('Outcome')))                ].copy()if len(cross_lag_filtered) > 0:                cross_lag_filtered['时间间隔'] = cross_lag_filtered.apply(                    lambda row: f"T{row['rhs'].split('_')[-1]}→T{row['lhs'].split('_')[-1]}", axis=1                )                cross_lag_filtered['方向'] = cross_lag_filtered.apply(                    lambda row: 'Variable2 → Outcome'if'Variable2'in str(row['rhs']) else'Outcome → Variable2',                    axis=1                )                cross_lag_filtered['显著性'] = cross_lag_filtered['pvalue'].apply(                    lambda p: '***'if p < 0.001 else'**'if p < 0.01 else'*'if p < 0.05 else''                )# 创建图表                plt.figure(figsize=(10, 6))# 为每个方向和每个时间间隔创建条形                unique_intervals = sorted(cross_lag_filtered['时间间隔'].unique())                directions = sorted(cross_lag_filtered['方向'].unique())                x = np.arange(len(unique_intervals))                width = 0.35for i, direction in enumerate(directions):                    values = []                    errors = []                    sig_labels = []for interval in unique_intervals:                        subset = cross_lag_filtered[                            (cross_lag_filtered['时间间隔'] == interval) &                            (cross_lag_filtered['方向'] == direction)                            ]if len(subset) > 0:                            row = subset.iloc[0]                            values.append(row.get('Estimate', 0))                            errors.append(row.get('se', 0))                            sig_labels.append(row.get('显著性'''))else:                            values.append(0)                            errors.append(0)                            sig_labels.append('')# 绘制条形                    positions = x + (i - 0.5) * width                    bars = plt.bar(positions, values, width, label=direction)# 添加误差条for j, (pos, val, err) in enumerate(zip(positions, values, errors)):if err > 0:                            plt.errorbar(pos, val, yerr=1.96 * err, fmt='none', color='black', capsize=3)# 添加系数文本if val != 0:                            plt.text(pos, val + (0.02 if val >= 0 else -0.02),                                     f"{val:.3f}{sig_labels[j]}",                                     ha='center', va='bottom'if val >= 0 else'top')                plt.xlabel('时间间隔', fontsize=12, fontweight='bold')                plt.ylabel('标准化系数', fontsize=12, fontweight='bold')                plt.title(f'交叉滞后路径系数 - {model_type}', fontsize=14, fontweight='bold')                plt.xticks(x, unique_intervals)                plt.legend()                plt.grid(True, alpha=0.3, axis='y')                plt.tight_layout()                plt.savefig(results_dir / "Cross_Lag_Coefficients.png", dpi=300)                plt.close()print("已保存交叉滞后系数图")else:print("无交叉滞后路径数据")else:print("参数估计数据中没有'lhs'或'rhs'列")    except Exception as e:print(f"创建交叉滞后系数图失败: {e}")def create_autoregressive_plot(parameter_estimates, model_type, results_dir):"""创建自回归系数图"""    try:if parameter_estimates is None or len(parameter_estimates) == 0:print("无参数估计数据,跳过自回归系数图")return# 检查参数估计的列名print(f"参数估计列名: {parameter_estimates.columns.tolist()}")# 提取自回归系数        ar_data = parameter_estimates.copy()# 重命名列以匹配我们的代码        column_mapping = {'lval''lhs','rval''rhs','Estimate''Estimate','Std. Err''se','z-value''z','p-value''pvalue','Est. Std''std_est'        }for old_col, new_col in column_mapping.items():if old_col in ar_data.columns:                ar_data[new_col] = ar_data[old_col]# 筛选自回归路径if'lhs'in ar_data.columns and 'rhs'in ar_data.columns:            ar_filtered = ar_data[                (ar_data['op'] == '~') &                ((ar_data['lhs'].str.contains('Outcome') & ar_data['rhs'].str.contains('Outcome')) |                 (ar_data['lhs'].str.contains('Variable2') & ar_data['rhs'].str.contains('Variable2')))                ].copy()if len(ar_filtered) > 0:                ar_filtered['时间间隔'] = ar_filtered.apply(                    lambda row: f"T{row['rhs'].split('_')[-1]}→T{row['lhs'].split('_')[-1]}", axis=1                )                ar_filtered['变量'] = ar_filtered.apply(                    lambda row: 'Outcome'if'Outcome'in str(row['lhs']) else'Variable2', axis=1                )                ar_filtered['显著性'] = ar_filtered['pvalue'].apply(                    lambda p: '***'if p < 0.001 else'**'if p < 0.01 else'*'if p < 0.05 else''                )# 创建图表                plt.figure(figsize=(10, 6))# 为每个变量和每个时间间隔创建条形                unique_intervals = sorted(ar_filtered['时间间隔'].unique())                variables = sorted(ar_filtered['变量'].unique())                x = np.arange(len(unique_intervals))                width = 0.35for i, variable in enumerate(variables):                    values = []                    errors = []                    sig_labels = []for interval in unique_intervals:                        subset = ar_filtered[                            (ar_filtered['时间间隔'] == interval) &                            (ar_filtered['变量'] == variable)                            ]if len(subset) > 0:                            row = subset.iloc[0]                            values.append(row.get('Estimate', 0))                            errors.append(row.get('se', 0))                            sig_labels.append(row.get('显著性'''))else:                            values.append(0)                            errors.append(0)                            sig_labels.append('')# 绘制条形                    positions = x + (i - 0.5) * width                    bars = plt.bar(positions, values, width, label=variable)# 添加误差条for j, (pos, val, err) in enumerate(zip(positions, values, errors)):if err > 0:                            plt.errorbar(pos, val, yerr=1.96 * err, fmt='none', color='black', capsize=3)# 添加系数文本if val != 0:                            plt.text(pos, val + (0.02 if val >= 0 else -0.02),                                     f"{val:.3f}{sig_labels[j]}",                                     ha='center', va='bottom'if val >= 0 else'top')                plt.xlabel('时间间隔', fontsize=12, fontweight='bold')                plt.ylabel('标准化系数', fontsize=12, fontweight='bold')                plt.title(f'自回归路径系数 - {model_type}', fontsize=14, fontweight='bold')                plt.xticks(x, unique_intervals)                plt.legend()                plt.grid(True, alpha=0.3, axis='y')                plt.tight_layout()                plt.savefig(results_dir / "Autoregressive_Coefficients.png", dpi=300)                plt.close()print("已保存自回归系数图")else:print("无自回归路径数据")else:print("参数估计数据中没有'lhs'或'rhs'列")    except Exception as e:print(f"创建自回归系数图失败: {e}")def create_variable_trend_plot(clpm_data, results_dir):"""创建变量趋势图"""    try:# 计算均值和标准误        trend_data = clpm_data.groupby('Time').agg(            Outcome_mean=('Outcome_Continuous''mean'),            Outcome_se=('Outcome_Continuous', lambda x: x.std() / np.sqrt(len(x))),            Variable2_mean=('Variable2''mean'),            Variable2_se=('Variable2', lambda x: x.std() / np.sqrt(len(x)))        ).reset_index()        plt.figure(figsize=(10, 6))# 绘制Outcome趋势        plt.errorbar(trend_data['Time'], trend_data['Outcome_mean'],                     yerr=1.96 * trend_data['Outcome_se'],                     label='Outcome', marker='o', capsize=5, linewidth=2)# 绘制Variable2趋势        plt.errorbar(trend_data['Time'], trend_data['Variable2_mean'],                     yerr=1.96 * trend_data['Variable2_se'],                     label='Variable2', marker='s', capsize=5, linewidth=2)        plt.xlabel('时间点', fontsize=12, fontweight='bold')        plt.ylabel('均值', fontsize=12, fontweight='bold')        plt.title('变量随时间变化趋势', fontsize=14, fontweight='bold')        plt.legend()        plt.grid(True, alpha=0.3)        plt.xticks(sorted(clpm_data['Time'].unique()))        plt.tight_layout()        plt.savefig(results_dir / "Variable_Trends.png", dpi=300)        plt.close()print("已保存变量趋势图")    except Exception as e:print(f"创建变量趋势图失败: {e}")# 7. 创建Word报告def create_word_report(clpm_data, wide_data, model_type, fit_measures,                       parameter_estimates, desc_stats, results_dir):"""创建Word分析报告"""    doc = Document()# 添加标题    title = doc.add_heading('交叉滞后模型分析报告', 0)    title.alignment = WD_ALIGN_PARAGRAPH.CENTER# 添加日期    doc.add_paragraph(f'生成日期: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')    doc.add_paragraph()# 1. 研究背景与目的    doc.add_heading('1. 研究背景与目的', level=1)    doc.add_paragraph('交叉滞后模型用于分析两个变量之间的动态相互关系,检验变量X和Y在多个时间点上的相互滞后预测关系,为因果方向推断提供证据。''本研究旨在探讨Outcome_Continuous与Variable2之间的双向关系。'    )    doc.add_paragraph()# 2. 数据描述    doc.add_heading('2. 数据描述', level=1)    doc.add_paragraph(f'分析样本量: {len(wide_data.dropna())} 个完整案例')    doc.add_paragraph(        f'时间点: 0-{len(clpm_data["Time"].unique()) - 1} (共{len(clpm_data["Time"].unique())}个测量时点)')    doc.add_paragraph('变量: Outcome_Continuous (连续结局变量) 和 Variable2 (连续变量)')    doc.add_paragraph(f'使用模型: {model_type}')    doc.add_paragraph()# 3. 模型拟合结果    doc.add_heading('3. 模型拟合结果', level=1)    doc.add_paragraph(f'模型拟合指标如下(使用{model_type}):')# 创建拟合指标表格if fit_measures is not None:        fit_table = doc.add_table(rows=1, cols=2)        fit_table.style = 'Light Shading Accent 1'        hdr_cells = fit_table.rows[0].cells        hdr_cells[0].text = '指标'        hdr_cells[1].text = '值'        fit_items = [            ('卡方值', fit_measures.get('Chi2''N/A')),            ('自由度', fit_measures.get('DoF''N/A')),            ('P值', fit_measures.get('p-value''N/A')),            ('CFI', fit_measures.get('CFI''N/A')),            ('TLI', fit_measures.get('TLI''N/A')),            ('RMSEA', fit_measures.get('RMSEA''N/A')),            ('SRMR', fit_measures.get('SRMR''N/A')),            ('AIC', fit_measures.get('AIC''N/A')),            ('BIC', fit_measures.get('BIC''N/A'))        ]for item_name, item_value in fit_items:            row_cells = fit_table.add_row().cells            row_cells[0].text = item_nameif isinstance(item_value, (int, float)):                row_cells[1].text = f'{item_value:.3f}'else:                row_cells[1].text = str(item_value)    doc.add_paragraph()# 4. 主要路径系数if parameter_estimates is not None and len(parameter_estimates) > 0:        doc.add_heading('4. 主要路径系数', level=1)        try:# 创建路径系数表格            path_table = doc.add_table(rows=1, cols=5)            path_table.style = 'Light Shading Accent 1'            hdr_cells = path_table.rows[0].cells            hdr_cells[0].text = '路径'            hdr_cells[1].text = '估计值'            hdr_cells[2].text = '标准误'            hdr_cells[3].text = 'z值'            hdr_cells[4].text = 'P值'# 检查参数估计的列名print(f"创建报告时参数估计列名: {parameter_estimates.columns.tolist()}")# 重命名列以便处理            param_df = parameter_estimates.copy()# 尝试不同的列名组合            possible_columns = {'lhs': ['lval''lhs''from''源变量'],'rhs': ['rval''rhs''to''目标变量'],'estimate': ['Estimate''est''系数''值'],'se': ['Std. Err''se''标准误''标准误差'],'z': ['z-value''z''z值'],'p': ['p-value''p''p值''显著性']            }# 找到实际存在的列名            actual_columns = {}for key, possible_names in possible_columns.items():for name in possible_names:if name in param_df.columns:                        actual_columns[key] = namebreakif key not in actual_columns:                    actual_columns[key] = None# 添加路径行for _, row in param_df.iterrows():if actual_columns['lhs'] and actual_columns['rhs']:                    path = f"{row[actual_columns['lhs']]} ← {row[actual_columns['rhs']]}"else:                    path = f"{row.iloc[0]} ← {row.iloc[1]}"# 使用前两列                est = row[actual_columns['estimate']] if actual_columns['estimate'else'N/A'                se = row[actual_columns['se']] if actual_columns['se'else'N/A'                z = row[actual_columns['z']] if actual_columns['z'else'N/A'                p = row[actual_columns['p']] if actual_columns['p'else'N/A'                row_cells = path_table.add_row().cells                row_cells[0].text = str(path)                row_cells[1].text = f"{est:.4f}"if isinstance(est, (int, float)) else str(est)                row_cells[2].text = f"{se:.4f}"if isinstance(se, (int, float)) else str(se)                row_cells[3].text = f"{z:.4f}"if isinstance(z, (int, float)) else str(z)                row_cells[4].text = f"{p:.4f}"if isinstance(p, (int, float)) else str(p)        except Exception as e:            doc.add_paragraph(f"创建路径系数表时出错: {e}")    doc.add_paragraph()# 5. 可视化结果    doc.add_heading('5. 可视化结果', level=1)# 添加图片    img_files = ["Variable_Trends.png","Cross_Lag_Coefficients.png","Autoregressive_Coefficients.png","CLPM_Path_Diagram.png"    ]    img_titles = ["图1: 变量随时间变化趋势图","图2: 交叉滞后路径系数图","图3: 自回归路径系数图","图4: 交叉滞后模型路径图"    ]for i, img_file in enumerate(img_files):        img_path = results_dir / img_fileif img_path.exists():            try:                doc.add_picture(str(img_path), width=Inches(6))                doc.add_paragraph(img_titles[i])                doc.add_paragraph()            except Exception as e:print(f"添加图片 {img_file} 失败: {e}")                doc.add_paragraph(f"{img_titles[i]} (图片加载失败)")# 6. 结果解释与讨论    doc.add_heading('6. 结果解释与讨论', level=1)    doc.add_heading('6.1 主要发现', level=2)# 基于描述性统计提供解释if desc_stats is not None and len(desc_stats) > 0:        doc.add_paragraph(            f'1) Outcome_Continuous随时间呈现上升趋势,从T0的{desc_stats.iloc[0]["Outcome_mean"]:.2f}上升到T4的{desc_stats.iloc[-1]["Outcome_mean"]:.2f}。')        doc.add_paragraph(            f'2) Variable2也随时间呈现上升趋势,从T0的{desc_stats.iloc[0]["Variable2_mean"]:.2f}上升到T4的{desc_stats.iloc[-1]["Variable2_mean"]:.2f}。')    doc.add_paragraph('3) 交叉滞后模型分析揭示了两个变量之间的动态相互关系。')    doc.add_heading('6.2 公共卫生意义', level=2)    doc.add_paragraph('基于交叉滞后模型的结果,我们可以探讨变量间的动态相互关系:')    doc.add_paragraph('1) 自回归系数反映了变量的稳定性,系数越高表明该变量越稳定;', style='List Bullet')    doc.add_paragraph('2) 交叉滞后系数反映了变量间的相互预测关系;', style='List Bullet')    doc.add_paragraph('3) 如果Variable2→Outcome的路径显著,表明Variable2的变化可能预测Outcome_Continuous的后续变化;',                      style='List Bullet')    doc.add_paragraph('4) 如果Outcome→Variable2的路径显著,表明Outcome_Continuous的变化可能预测Variable2的后续变化;',                      style='List Bullet')    doc.add_paragraph('5) 如果两条交叉滞后路径都显著,表明存在双向影响关系。', style='List Bullet')    doc.add_paragraph('这些发现对制定干预策略具有重要指导意义,帮助确定优先干预的靶点。')    doc.add_paragraph()# 7. 研究局限与建议    doc.add_heading('7. 研究局限与建议', level=1)    doc.add_paragraph('1) 本研究基于观察性数据,交叉滞后模型提供了因果推断的初步证据,但仍需谨慎解释;',                      style='List Bullet')    doc.add_paragraph(f'2) 使用{model_type},可能简化了实际的时间动态关系;', style='List Bullet')    doc.add_paragraph('3) 建议未来研究考虑更多潜在混杂变量;', style='List Bullet')    doc.add_paragraph('4) 可进一步探讨调节效应和群体异质性。', style='List Bullet')    doc.add_paragraph()# 8. 结论    doc.add_heading('8. 结论', level=1)if fit_measures is not None:        cfi = fit_measures.get('CFI', 0)if isinstance(cfi, (int, float)):            fit_eval = "模型拟合良好,"if cfi > 0.90 else"模型拟合一般,"else:            fit_eval = "模型拟合一般,"else:        fit_eval = "模型拟合一般,"    doc.add_paragraph(        f'本研究通过{model_type}分析了Outcome_Continuous与Variable2之间的动态相互关系。'        f'{fit_eval}分析揭示了变量间的相互预测关系,为理解变量间的动态关系提供了依据。'    )# 保存文档    report_path = results_dir / "Cross_Lagged_Panel_Model_Report.docx"    doc.save(str(report_path))print(f"已保存Word分析报告: {report_path}")return docdef create_simplified_report(clpm_data, wide_data, desc_stats, results_dir):"""创建简化报告(当模型拟合失败时)"""    doc = Document()# 添加标题    title = doc.add_heading('交叉滞后模型分析报告', 0)    title.alignment = WD_ALIGN_PARAGRAPH.CENTER    doc.add_paragraph(f'生成日期: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')    doc.add_paragraph()    doc.add_heading('分析说明', level=1)    doc.add_paragraph('由于数据或模型设定问题,交叉滞后模型未能成功拟合。以下是基本数据描述和探索性分析:'    )    doc.add_paragraph(f'总样本量: {len(clpm_data)}')    doc.add_paragraph(f'宽格式完整案例: {len(wide_data.dropna())}')    doc.add_paragraph()# 数据描述性统计    doc.add_heading('数据描述性统计', level=1)if desc_stats is not None:        desc_table = doc.add_table(rows=len(desc_stats) + 1, cols=6)        desc_table.style = 'Light Shading Accent 1'# 表头        hdr_cells = desc_table.rows[0].cells        headers = ['时间点''样本量''Outcome均值''Outcome标准差''Variable2均值''Variable2标准差']for i, header in enumerate(headers):            hdr_cells[i].text = header# 数据行for i, (_, row) in enumerate(desc_stats.iterrows(), 1):            row_cells = desc_table.rows[i].cells            row_cells[0].text = str(row['Time'])            row_cells[1].text = str(row['n'])            row_cells[2].text = f"{row['Outcome_mean']:.3f}"            row_cells[3].text = f"{row['Outcome_sd']:.3f}"            row_cells[4].text = f"{row['Variable2_mean']:.3f}"            row_cells[5].text = f"{row['Variable2_sd']:.3f}"    doc.add_paragraph()# 变量变化趋势图    doc.add_heading('变量变化趋势图', level=1)# 保存变量趋势图    create_variable_trend_plot(clpm_data, results_dir)    img_path = results_dir / "Variable_Trends.png"if img_path.exists():        doc.add_picture(str(img_path), width=Inches(6))        doc.add_paragraph("图1: 变量随时间变化趋势图")    doc.add_paragraph()# 建议    doc.add_heading('建议', level=1)    doc.add_paragraph('1) 检查数据质量,确保无异常值;', style='List Bullet')    doc.add_paragraph('2) 考虑简化模型或使用其他分析方法;', style='List Bullet')    doc.add_paragraph('3) 增加样本量以提高模型稳定性;', style='List Bullet')    doc.add_paragraph('4) 检查变量间的线性关系和正态性假设。', style='List Bullet')# 保存文档    report_path = results_dir / "Cross_Lagged_Panel_Model_Report.docx"    doc.save(str(report_path))print(f"已保存简化Word分析报告: {report_path}")return docdef save_results_to_excel(parameter_estimates, fit_measures, desc_stats, results_dir):"""将结果保存到Excel文件"""    excel_path = results_dir / "CLPM_Results.xlsx"    with pd.ExcelWriter(excel_path, engine='openpyxl') as writer:# 保存参数估计if parameter_estimates is not None:            parameter_estimates.to_excel(writer, sheet_name='参数估计', index=False)# 保存拟合指标if fit_measures is not None:            fit_df = pd.DataFrame([fit_measures])            fit_df.to_excel(writer, sheet_name='拟合指标', index=False)# 保存描述性统计if desc_stats is not None:            desc_stats.to_excel(writer, sheet_name='描述性统计', index=False)# 保存数据基本情况if desc_stats is not None:            basic_stats = pd.DataFrame({'统计量': ['样本量''时间点数''变量数'],'值': [desc_stats['n'].sum() if'n'in desc_stats.columns else 0,                       len(desc_stats) if desc_stats is not None else 0, 2]            })            basic_stats.to_excel(writer, sheet_name='基本情况', index=False)print(f"已保存Excel结果文件: {excel_path}")# 主函数def main():"""主函数"""print("=" * 60)print("交叉滞后模型(CLPM)分析 - Python实现")print("=" * 60)# 1. 读取数据print("\n1. 读取数据...")    full_data, simple_data = read_data()# 2. 数据准备print("\n2. 数据准备...")    clpm_data = prepare_data(full_data)# 3. 转换为宽格式print("\n3. 转换为宽格式...")    wide_data, time_points = convert_to_wide_format(clpm_data)# 4. 描述性统计print("\n4. 计算描述性统计...")    desc_stats = descriptive_statistics(clpm_data)# 5. 拟合交叉滞后模型print("\n5. 拟合交叉滞后模型...")    model, model_type, fit_measures, parameter_estimates = fit_clpm_model(wide_data, time_points)# 6. 可视化print("\n6. 创建可视化图表...")if model is not None:        create_visualizations(clpm_data, model, parameter_estimates, model_type, results_dir)else:# 如果模型拟合失败,至少创建变量趋势图        create_variable_trend_plot(clpm_data, results_dir)# 7. 创建报告print("\n7. 创建分析报告...")if model is not None:        doc = create_word_report(            clpm_data, wide_data, model_type, fit_measures,            parameter_estimates, desc_stats, results_dir        )else:        doc = create_simplified_report(clpm_data, wide_data, desc_stats, results_dir)# 8. 保存结果到Excelprint("\n8. 保存结果到Excel...")    save_results_to_excel(parameter_estimates, fit_measures, desc_stats, results_dir)# 9. 输出关键结果摘要print("\n" + "=" * 60)print("关键分析结果摘要")print("=" * 60)if model is not None:print(f"模型类型: {model_type}")if fit_measures is not None:            cfi = fit_measures.get('CFI''N/A')            tli = fit_measures.get('TLI''N/A')            rmsea = fit_measures.get('RMSEA''N/A')            srmr = fit_measures.get('SRMR''N/A')print(f"模型拟合: CFI={cfi}, TLI={tli}, RMSEA={rmsea}, SRMR={srmr}")else:print("模型拟合失败,请检查数据或模型设定")print(f"\n分析完成!结果已保存到: {results_dir}")print("\n请检查文件夹中的以下文件:")print("1. Cross_Lagged_Panel_Model_Report.docx - 分析报告")print("2. CLPM_Results.xlsx - Excel结果文件")print("3. CLPM_Path_Diagram.png - 路径图")print("4. Cross_Lag_Coefficients.png - 交叉滞后系数图")print("5. Autoregressive_Coefficients.png - 自回归系数图")print("6. Variable_Trends.png - 变量趋势图")# 清理内存    import gc    gc.collect()print("\n脚本执行完成!")# 运行主函数if __name__ == "__main__":    main()

纵向数据是指在多个时间点对同一组个体进行的重复测量。

1    混合效应模型Mixed Effects ModelMEM

2 固定效应模型 Fixed Effects Model FEM

3 多层线性模型 Hierarchical Linear Model HLM

4 广义估计方程 Generalized Estimating Equations GEE

5 广义线性混合模型 Generalized Linear Mixed Models GLMM

6 潜变量增长曲线模型 Latent Growth Curve Model LGCM

7 组轨迹模型 Group-Based Trajectory Model GBTM

8 交叉滞后模型 Cross-lagged (Panel) Model CLPM

9 重复测量方差分析 Repeated Measures ANOVA / MANOVA RM-ANOVA / RM-MANOVA

10 非线性混合效应模型 Nonlinear Mixed-Effects Models NLME

11 联合模型     Joint Models     JM

12 结构方程模型 Structural Equation Modeling SEM

13 广义相加模型 Generalized Additive Models GAM

14 潜类别模型 Latent Class Models LCM

15 潜剖面模型 Latent Profile Analysis LPA

16 状态空间模型 State Space Models SSM

17 纵向因子分析 Longitudinal Factor Analysis LFA

18 贝叶斯纵向模型 Bayesian Longitudinal Models - (Bayesian Models)

19 混合效应随机森林 Mixed Effects Random Forest MERF

20 纵向梯度提升 Longitudinal Gradient Boosting - (Longitudinal GBM)

21 K均值纵向聚类 K-means Longitudinal Clustering - (DTW-KMeans)

22   基于模型的聚类 Model-Based ClusteringMB-CLUST

医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!

!!!可加我粉丝群!!!

“医学统计数据分析”公众号右下角;

找到“联系作者”,

可加我微信,邀请入粉丝群!

【医学统计数据分析】工作室“粉丝群”
01
【临床】粉丝群

有临床流行病学数据分析

如(t检验、方差分析、χ2检验、logistic回归)、

(重复测量方差分析与配对T检验、ROC曲线)、

(非参数检验、生存分析、样本含量估计)、

(筛检试验:灵敏度、特异度、约登指数等计算)、

(绘制柱状图、散点图、小提琴图、列线图等)、

机器学习、深度学习、生存分析

等需求的同仁们,加入【临床】粉丝群

02
【公卫】粉丝群

疾控,公卫岗位的同仁,可以加一下【公卫】粉丝群,分享生态学研究、空间分析、时间序列、监测数据分析、时空面板技巧等工作科研自动化内容。

03
【生信】粉丝群

有实验室数据分析需求的同仁们,可以加入【生信】粉丝群,交流NCBI(基因序列)、UniProt(蛋白质)、KEGG(通路)、GEO(公共数据集)等公共数据库、基因组学转录组学蛋白组学代谢组学表型组学等数据分析和可视化内容。

或者可扫码直接加微信进群!!!

精品视频课程-“医学统计数据分析”视频号付费合集

“医学统计数据分析”视频号-付费合集兑换相应课程后,获取课程理论课PPT、代码、基础数据等相关资料,请大家在【医学统计数据分析】公众号右下角,找到“联系作者”,加我微信后打包发送。感谢您的支持!!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 10:05:52 HTTP/2.0 GET : https://f.mffb.com.cn/a/480608.html
  2. 运行时间 : 0.205169s [ 吞吐率:4.87req/s ] 内存消耗:4,772.74kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=99c522deebb958cc4ce9982404f74adc
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001034s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001628s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000821s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000679s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001512s ]
  6. SELECT * FROM `set` [ RunTime:0.000683s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001522s ]
  8. SELECT * FROM `article` WHERE `id` = 480608 LIMIT 1 [ RunTime:0.001276s ]
  9. UPDATE `article` SET `lasttime` = 1774577152 WHERE `id` = 480608 [ RunTime:0.018041s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.002021s ]
  11. SELECT * FROM `article` WHERE `id` < 480608 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003757s ]
  12. SELECT * FROM `article` WHERE `id` > 480608 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002464s ]
  13. SELECT * FROM `article` WHERE `id` < 480608 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004981s ]
  14. SELECT * FROM `article` WHERE `id` < 480608 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002418s ]
  15. SELECT * FROM `article` WHERE `id` < 480608 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002190s ]
0.208854s