Skip to content

调节效应

基于交互项的调节效应分析。

核心代码

py
    def _fit_moderation_analysis(
        self,
        df: pd.DataFrame,
        entity_col: str,
        time_col: str,
        decimals: int,
        title: str,
    ) -> Any:
        x_var, controls = self._resolve_core_x_and_controls()
        moderator_var = str(self.moderator_var or '').strip()
        if not moderator_var:
            raise ValueError(_('调节机制必须选择 1 个调节变量。'))

        model_kind, absorb_vars, panel_dims, base_rows = self._resolve_advanced_model_spec()
        add_main_effects = bool(self.moderation_options.get('add_main_effects', True))

        work_df = df.copy()
        interaction_name = f'{x_var} × {moderator_var}'
        work_df[interaction_name] = pd.to_numeric(work_df[x_var], errors='coerce') * pd.to_numeric(work_df[moderator_var], errors='coerce')
        regressors = ([x_var, moderator_var] if add_main_effects else []) + [interaction_name] + controls
        fit_info = self._fit_linear_model(
            work_df,
            self.y_var,
            regressors,
            model_kind=model_kind,
            absorb_vars=absorb_vars,
            panel_dims=panel_dims,
            header=_('调节机制 - 交互项回归'),
        )

        self._result_model_snapshots = []
        self._store_result_model_snapshot(
            method='moderation',
            method_label=_('交互项回归'),
            y_name=self.y_var,
            x_vars=regressors,
            params=fit_info['params'],
            std_errors=fit_info['std_errors'],
            test_stats=fit_info['test_stats'],
            pvalues=fit_info['pvalues'],
            stats=fit_info['stats'],
            custom_rows=base_rows + [{'label': _('包含主效应'), 'value': _('是') if add_main_effects else _('否')}],
        )

        summary_rows = [
            {'项目': _('核心解释变量'), '取值': x_var},
            {'项目': _('调节变量'), '取值': moderator_var},
            {'项目': _('交互项'), '取值': interaction_name},
            {'项目': _('是否包含主效应'), '取值': _('是') if add_main_effects else _('否')},
            {'项目': _('交互项系数'), '取值': fit_info['params'].get(interaction_name, np.nan)},
            {'项目': _('交互项标准误'), '取值': fit_info['std_errors'].get(interaction_name, np.nan)},
            {'项目': _('交互项统计量'), '取值': fit_info['test_stats'].get(interaction_name, np.nan)},
            {'项目': _('交互项 P-value'), '取值': fit_info['pvalues'].get(interaction_name, np.nan)},
        ]

        self.result = fit_info['result']
        self.model_stats = dict(fit_info['stats'])
        self.display_x_vars = regressors
        self.table_custom_rows = base_rows
        self.diagnostic_html = (
            '<div style="margin-top: 30px;"></div>'
            + self._render_dataframe_table(pd.DataFrame(summary_rows), _('%(title)s - 设定摘要') % {'title': title or _('调节机制')}, decimals=decimals)
        )
        self.raw_output = fit_info['raw_output']
        return self.result

Released under the AGPL-3.0 License.