外观
调节效应
基于交互项的调节效应分析。
核心代码
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