aigroup-econ-mcp 1.3.3__py3-none-any.whl → 2.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. .gitignore +253 -0
  2. PKG-INFO +732 -0
  3. README.md +687 -0
  4. __init__.py +14 -0
  5. aigroup_econ_mcp-2.0.1.dist-info/METADATA +732 -0
  6. aigroup_econ_mcp-2.0.1.dist-info/RECORD +170 -0
  7. aigroup_econ_mcp-2.0.1.dist-info/entry_points.txt +2 -0
  8. aigroup_econ_mcp-2.0.1.dist-info/licenses/LICENSE +21 -0
  9. cli.py +32 -0
  10. econometrics/README.md +18 -0
  11. econometrics/__init__.py +191 -0
  12. econometrics/advanced_methods/modern_computing_machine_learning/__init__.py +30 -0
  13. econometrics/advanced_methods/modern_computing_machine_learning/causal_forest.py +253 -0
  14. econometrics/advanced_methods/modern_computing_machine_learning/double_ml.py +268 -0
  15. econometrics/advanced_methods/modern_computing_machine_learning/gradient_boosting.py +249 -0
  16. econometrics/advanced_methods/modern_computing_machine_learning/hierarchical_clustering.py +243 -0
  17. econometrics/advanced_methods/modern_computing_machine_learning/kmeans_clustering.py +293 -0
  18. econometrics/advanced_methods/modern_computing_machine_learning/neural_network.py +264 -0
  19. econometrics/advanced_methods/modern_computing_machine_learning/random_forest.py +195 -0
  20. econometrics/advanced_methods/modern_computing_machine_learning/support_vector_machine.py +226 -0
  21. econometrics/advanced_methods/modern_computing_machine_learning/test_all_modules.py +329 -0
  22. econometrics/advanced_methods/modern_computing_machine_learning/test_report.md +107 -0
  23. econometrics/basic_parametric_estimation/__init__.py +31 -0
  24. econometrics/basic_parametric_estimation/gmm/__init__.py +13 -0
  25. econometrics/basic_parametric_estimation/gmm/gmm_model.py +256 -0
  26. econometrics/basic_parametric_estimation/mle/__init__.py +13 -0
  27. econometrics/basic_parametric_estimation/mle/mle_model.py +241 -0
  28. econometrics/basic_parametric_estimation/ols/__init__.py +13 -0
  29. econometrics/basic_parametric_estimation/ols/ols_model.py +141 -0
  30. econometrics/causal_inference/__init__.py +66 -0
  31. econometrics/causal_inference/causal_identification_strategy/__init__.py +104 -0
  32. econometrics/causal_inference/causal_identification_strategy/control_function.py +112 -0
  33. econometrics/causal_inference/causal_identification_strategy/difference_in_differences.py +107 -0
  34. econometrics/causal_inference/causal_identification_strategy/event_study.py +119 -0
  35. econometrics/causal_inference/causal_identification_strategy/first_difference.py +89 -0
  36. econometrics/causal_inference/causal_identification_strategy/fixed_effects.py +103 -0
  37. econometrics/causal_inference/causal_identification_strategy/hausman_test.py +69 -0
  38. econometrics/causal_inference/causal_identification_strategy/instrumental_variables.py +145 -0
  39. econometrics/causal_inference/causal_identification_strategy/mediation_analysis.py +121 -0
  40. econometrics/causal_inference/causal_identification_strategy/moderation_analysis.py +109 -0
  41. econometrics/causal_inference/causal_identification_strategy/propensity_score_matching.py +140 -0
  42. econometrics/causal_inference/causal_identification_strategy/random_effects.py +100 -0
  43. econometrics/causal_inference/causal_identification_strategy/regression_discontinuity.py +98 -0
  44. econometrics/causal_inference/causal_identification_strategy/synthetic_control.py +111 -0
  45. econometrics/causal_inference/causal_identification_strategy/triple_difference.py +86 -0
  46. econometrics/distribution_analysis/__init__.py +28 -0
  47. econometrics/distribution_analysis/oaxaca_blinder.py +184 -0
  48. econometrics/distribution_analysis/time_series_decomposition.py +152 -0
  49. econometrics/distribution_analysis/variance_decomposition.py +179 -0
  50. econometrics/missing_data/__init__.py +18 -0
  51. econometrics/missing_data/imputation_methods.py +219 -0
  52. econometrics/missing_data/missing_data_measurement_error/__init__.py +0 -0
  53. econometrics/model_specification_diagnostics_robust_inference/README.md +173 -0
  54. econometrics/model_specification_diagnostics_robust_inference/__init__.py +78 -0
  55. econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/__init__.py +20 -0
  56. econometrics/model_specification_diagnostics_robust_inference/diagnostic_tests/diagnostic_tests_model.py +149 -0
  57. econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/__init__.py +15 -0
  58. econometrics/model_specification_diagnostics_robust_inference/generalized_least_squares/gls_model.py +130 -0
  59. econometrics/model_specification_diagnostics_robust_inference/model_selection/__init__.py +18 -0
  60. econometrics/model_specification_diagnostics_robust_inference/model_selection/model_selection_model.py +286 -0
  61. econometrics/model_specification_diagnostics_robust_inference/regularization/__init__.py +15 -0
  62. econometrics/model_specification_diagnostics_robust_inference/regularization/regularization_model.py +177 -0
  63. econometrics/model_specification_diagnostics_robust_inference/robust_errors/__init__.py +15 -0
  64. econometrics/model_specification_diagnostics_robust_inference/robust_errors/robust_errors_model.py +122 -0
  65. econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/__init__.py +15 -0
  66. econometrics/model_specification_diagnostics_robust_inference/simultaneous_equations/simultaneous_equations_model.py +246 -0
  67. econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/__init__.py +15 -0
  68. econometrics/model_specification_diagnostics_robust_inference/weighted_least_squares/wls_model.py +127 -0
  69. econometrics/nonparametric/__init__.py +35 -0
  70. econometrics/nonparametric/gam_model.py +117 -0
  71. econometrics/nonparametric/kernel_regression.py +161 -0
  72. econometrics/nonparametric/nonparametric_semiparametric_methods/__init__.py +0 -0
  73. econometrics/nonparametric/quantile_regression.py +249 -0
  74. econometrics/nonparametric/spline_regression.py +100 -0
  75. econometrics/spatial_econometrics/__init__.py +68 -0
  76. econometrics/spatial_econometrics/geographically_weighted_regression.py +211 -0
  77. econometrics/spatial_econometrics/gwr_simple.py +154 -0
  78. econometrics/spatial_econometrics/spatial_autocorrelation.py +356 -0
  79. econometrics/spatial_econometrics/spatial_durbin_model.py +177 -0
  80. econometrics/spatial_econometrics/spatial_econometrics_new/__init__.py +0 -0
  81. econometrics/spatial_econometrics/spatial_regression.py +315 -0
  82. econometrics/spatial_econometrics/spatial_weights.py +226 -0
  83. econometrics/specific_data_modeling/micro_discrete_limited_data/README.md +164 -0
  84. econometrics/specific_data_modeling/micro_discrete_limited_data/__init__.py +40 -0
  85. econometrics/specific_data_modeling/micro_discrete_limited_data/count_data_models.py +311 -0
  86. econometrics/specific_data_modeling/micro_discrete_limited_data/discrete_choice_models.py +294 -0
  87. econometrics/specific_data_modeling/micro_discrete_limited_data/limited_dependent_variable_models.py +282 -0
  88. econometrics/specific_data_modeling/survival_duration_data/__init__.py +0 -0
  89. econometrics/specific_data_modeling/time_series_panel_data/__init__.py +143 -0
  90. econometrics/specific_data_modeling/time_series_panel_data/arima_model.py +104 -0
  91. econometrics/specific_data_modeling/time_series_panel_data/cointegration_vecm.py +334 -0
  92. econometrics/specific_data_modeling/time_series_panel_data/dynamic_panel_models.py +653 -0
  93. econometrics/specific_data_modeling/time_series_panel_data/exponential_smoothing.py +176 -0
  94. econometrics/specific_data_modeling/time_series_panel_data/garch_model.py +198 -0
  95. econometrics/specific_data_modeling/time_series_panel_data/panel_diagnostics.py +125 -0
  96. econometrics/specific_data_modeling/time_series_panel_data/panel_var.py +60 -0
  97. econometrics/specific_data_modeling/time_series_panel_data/structural_break_tests.py +87 -0
  98. econometrics/specific_data_modeling/time_series_panel_data/time_varying_parameter_models.py +106 -0
  99. econometrics/specific_data_modeling/time_series_panel_data/unit_root_tests.py +204 -0
  100. econometrics/specific_data_modeling/time_series_panel_data/var_svar_model.py +372 -0
  101. econometrics/statistical_inference/__init__.py +21 -0
  102. econometrics/statistical_inference/bootstrap_methods.py +162 -0
  103. econometrics/statistical_inference/permutation_test.py +177 -0
  104. econometrics/statistical_inference/statistical_inference_techniques/__init__.py +0 -0
  105. econometrics/statistics/distribution_decomposition_methods/__init__.py +0 -0
  106. econometrics/survival_analysis/__init__.py +18 -0
  107. econometrics/survival_analysis/survival_models.py +259 -0
  108. econometrics/tests/basic_parametric_estimation_tests/__init__.py +3 -0
  109. econometrics/tests/basic_parametric_estimation_tests/test_gmm.py +128 -0
  110. econometrics/tests/basic_parametric_estimation_tests/test_mle.py +127 -0
  111. econometrics/tests/basic_parametric_estimation_tests/test_ols.py +100 -0
  112. econometrics/tests/causal_inference_tests/__init__.py +3 -0
  113. econometrics/tests/causal_inference_tests/detailed_test.py +441 -0
  114. econometrics/tests/causal_inference_tests/test_all_methods.py +418 -0
  115. econometrics/tests/causal_inference_tests/test_causal_identification_strategy.py +202 -0
  116. econometrics/tests/causal_inference_tests/test_difference_in_differences.py +53 -0
  117. econometrics/tests/causal_inference_tests/test_instrumental_variables.py +44 -0
  118. econometrics/tests/model_specification_diagnostics_tests/__init__.py +3 -0
  119. econometrics/tests/model_specification_diagnostics_tests/test_diagnostic_tests.py +86 -0
  120. econometrics/tests/model_specification_diagnostics_tests/test_robust_errors.py +89 -0
  121. econometrics/tests/specific_data_modeling_tests/__init__.py +3 -0
  122. econometrics/tests/specific_data_modeling_tests/test_arima.py +98 -0
  123. econometrics/tests/specific_data_modeling_tests/test_dynamic_panel.py +198 -0
  124. econometrics/tests/specific_data_modeling_tests/test_exponential_smoothing.py +105 -0
  125. econometrics/tests/specific_data_modeling_tests/test_garch.py +118 -0
  126. econometrics/tests/specific_data_modeling_tests/test_micro_discrete_limited_data.py +189 -0
  127. econometrics/tests/specific_data_modeling_tests/test_unit_root.py +156 -0
  128. econometrics/tests/specific_data_modeling_tests/test_var.py +124 -0
  129. econometrics//321/206/320/254/320/272/321/205/342/225/235/320/220/321/205/320/237/320/241/321/205/320/264/320/267/321/207/342/226/222/342/225/227/321/204/342/225/235/320/250/321/205/320/225/320/230/321/207/342/225/221/320/267/321/205/320/230/320/226/321/206/320/256/320/240.md +544 -0
  130. prompts/__init__.py +0 -0
  131. prompts/analysis_guides.py +43 -0
  132. pyproject.toml +85 -0
  133. resources/MCP_MASTER_GUIDE.md +422 -0
  134. resources/MCP_TOOLS_DATA_FORMAT_GUIDE.md +185 -0
  135. resources/__init__.py +0 -0
  136. server.py +97 -0
  137. tools/README.md +88 -0
  138. tools/__init__.py +119 -0
  139. tools/causal_inference_adapter.py +658 -0
  140. tools/data_loader.py +213 -0
  141. tools/decorators.py +38 -0
  142. tools/distribution_analysis_adapter.py +121 -0
  143. tools/econometrics_adapter.py +286 -0
  144. tools/gwr_simple_adapter.py +54 -0
  145. tools/machine_learning_adapter.py +567 -0
  146. tools/mcp_tool_groups/__init__.py +15 -0
  147. tools/mcp_tool_groups/basic_parametric_tools.py +173 -0
  148. tools/mcp_tool_groups/causal_inference_tools.py +643 -0
  149. tools/mcp_tool_groups/distribution_analysis_tools.py +169 -0
  150. tools/mcp_tool_groups/machine_learning_tools.py +422 -0
  151. tools/mcp_tool_groups/microecon_tools.py +325 -0
  152. tools/mcp_tool_groups/missing_data_tools.py +117 -0
  153. tools/mcp_tool_groups/model_specification_tools.py +402 -0
  154. tools/mcp_tool_groups/nonparametric_tools.py +225 -0
  155. tools/mcp_tool_groups/spatial_econometrics_tools.py +323 -0
  156. tools/mcp_tool_groups/statistical_inference_tools.py +131 -0
  157. tools/mcp_tool_groups/time_series_tools.py +494 -0
  158. tools/mcp_tools_registry.py +124 -0
  159. tools/microecon_adapter.py +412 -0
  160. tools/missing_data_adapter.py +73 -0
  161. tools/model_specification_adapter.py +369 -0
  162. tools/nonparametric_adapter.py +190 -0
  163. tools/output_formatter.py +563 -0
  164. tools/spatial_econometrics_adapter.py +318 -0
  165. tools/statistical_inference_adapter.py +90 -0
  166. tools/survival_analysis_adapter.py +46 -0
  167. tools/time_series_panel_data_adapter.py +858 -0
  168. tools/time_series_panel_data_tools.py +65 -0
  169. aigroup_econ_mcp/__init__.py +0 -19
  170. aigroup_econ_mcp/cli.py +0 -82
  171. aigroup_econ_mcp/config.py +0 -561
  172. aigroup_econ_mcp/server.py +0 -452
  173. aigroup_econ_mcp/tools/__init__.py +0 -19
  174. aigroup_econ_mcp/tools/base.py +0 -470
  175. aigroup_econ_mcp/tools/cache.py +0 -533
  176. aigroup_econ_mcp/tools/data_loader.py +0 -195
  177. aigroup_econ_mcp/tools/file_parser.py +0 -1027
  178. aigroup_econ_mcp/tools/machine_learning.py +0 -60
  179. aigroup_econ_mcp/tools/ml_ensemble.py +0 -210
  180. aigroup_econ_mcp/tools/ml_evaluation.py +0 -272
  181. aigroup_econ_mcp/tools/ml_models.py +0 -54
  182. aigroup_econ_mcp/tools/ml_regularization.py +0 -186
  183. aigroup_econ_mcp/tools/monitoring.py +0 -555
  184. aigroup_econ_mcp/tools/optimized_example.py +0 -229
  185. aigroup_econ_mcp/tools/panel_data.py +0 -619
  186. aigroup_econ_mcp/tools/regression.py +0 -214
  187. aigroup_econ_mcp/tools/statistics.py +0 -154
  188. aigroup_econ_mcp/tools/time_series.py +0 -698
  189. aigroup_econ_mcp/tools/timeout.py +0 -283
  190. aigroup_econ_mcp/tools/tool_descriptions.py +0 -410
  191. aigroup_econ_mcp/tools/tool_handlers.py +0 -1016
  192. aigroup_econ_mcp/tools/tool_registry.py +0 -478
  193. aigroup_econ_mcp/tools/validation.py +0 -482
  194. aigroup_econ_mcp-1.3.3.dist-info/METADATA +0 -525
  195. aigroup_econ_mcp-1.3.3.dist-info/RECORD +0 -30
  196. aigroup_econ_mcp-1.3.3.dist-info/entry_points.txt +0 -2
  197. /aigroup_econ_mcp-1.3.3.dist-info/licenses/LICENSE → /LICENSE +0 -0
  198. {aigroup_econ_mcp-1.3.3.dist-info → aigroup_econ_mcp-2.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,441 @@
1
+ """
2
+ 详细测试所有因果识别策略方法
3
+ """
4
+
5
+ import numpy as np
6
+ import pandas as pd
7
+ from econometrics.causal_inference.causal_identification_strategy import *
8
+
9
+
10
+ def test_instrumental_variables():
11
+ """测试工具变量法"""
12
+ print("测试工具变量法...")
13
+ np.random.seed(42)
14
+ n = 100
15
+
16
+ # 生成数据
17
+ z = np.random.normal(0, 1, n) # 工具变量
18
+ e1 = np.random.normal(0, 1, n)
19
+ x = 1 + 0.5 * z + e1 # 内生变量
20
+ e2 = np.random.normal(0, 1, n)
21
+ y = 2 + 1.5 * x + e2 + 0.3 * e1 # 结果变量,包含内生性
22
+
23
+ try:
24
+ result = instrumental_variables_2sls(
25
+ y=y.tolist(),
26
+ x=x.reshape(-1, 1).tolist(),
27
+ instruments=z.reshape(-1, 1).tolist()
28
+ )
29
+ print(f" 系数: {result.estimate:.4f}")
30
+ print(f" 标准误: {result.std_error:.4f}")
31
+ print(f" p值: {result.p_value:.4f}")
32
+ print(" ✓ 工具变量法测试通过\n")
33
+ except Exception as e:
34
+ print(f" ✗ 工具变量法测试失败: {e}\n")
35
+
36
+
37
+ def test_control_function():
38
+ """测试控制函数法"""
39
+ print("测试控制函数法...")
40
+ np.random.seed(42)
41
+ n = 100
42
+
43
+ # 生成数据
44
+ z1 = np.random.normal(0, 1, n)
45
+ z2 = np.random.normal(0, 1, n)
46
+ e1 = np.random.normal(0, 1, n)
47
+ x = 1 + 0.5 * z1 + 0.3 * z2 + e1 # 内生变量
48
+ e2 = np.random.normal(0, 1, n)
49
+ y = 2 + 1.5 * x + e2 + 0.3 * e1 # 结果变量,包含内生性
50
+
51
+ try:
52
+ result = control_function_approach(
53
+ y=y.tolist(),
54
+ x=x.tolist(),
55
+ z=np.column_stack([z1, z2]).tolist()
56
+ )
57
+ print(f" 系数: {result.estimate:.4f}")
58
+ print(f" 标准误: {result.std_error:.4f}")
59
+ print(f" p值: {result.p_value:.4f}")
60
+ print(" ✓ 控制函数法测试通过\n")
61
+ except Exception as e:
62
+ print(f" ✗ 控制函数法测试失败: {e}\n")
63
+
64
+
65
+ def test_fixed_effects():
66
+ """测试固定效应模型"""
67
+ print("测试固定效应模型...")
68
+ np.random.seed(42)
69
+ n_entities = 10
70
+ n_periods = 5
71
+ n = n_entities * n_periods
72
+
73
+ # 生成面板数据
74
+ entity_ids = [f"entity_{i}" for i in range(n_entities) for _ in range(n_periods)]
75
+ time_periods = [f"period_{t}" for _ in range(n_entities) for t in range(n_periods)]
76
+ x = np.random.normal(0, 1, (n, 2)).tolist()
77
+
78
+ # 因变量(包含个体固定效应)
79
+ entity_effects = np.random.normal(0, 1, n_entities)
80
+ y = []
81
+ for i in range(n):
82
+ entity_idx = i // n_periods
83
+ y_value = 1 + 2 * x[i][0] + 1.5 * x[i][1] + entity_effects[entity_idx] + np.random.normal(0, 0.5)
84
+ y.append(y_value)
85
+
86
+ try:
87
+ result = fixed_effects_model(
88
+ y=y,
89
+ x=x,
90
+ entity_ids=entity_ids,
91
+ time_periods=time_periods
92
+ )
93
+ print(f" 系数: {result.estimate:.4f}")
94
+ print(f" 标准误: {result.std_error:.4f}")
95
+ print(f" p值: {result.p_value:.4f}")
96
+ print(" ✓ 固定效应模型测试通过\n")
97
+ except Exception as e:
98
+ print(f" ✗ 固定效应模型测试失败: {e}\n")
99
+
100
+
101
+ def test_random_effects():
102
+ """测试随机效应模型"""
103
+ print("测试随机效应模型...")
104
+ np.random.seed(42)
105
+ n_entities = 10
106
+ n_periods = 5
107
+ n = n_entities * n_periods
108
+
109
+ # 生成面板数据
110
+ entity_ids = [f"entity_{i}" for i in range(n_entities) for _ in range(n_periods)]
111
+ time_periods = [f"period_{t}" for _ in range(n_entities) for t in range(n_periods)]
112
+ x = np.random.normal(0, 1, (n, 2)).tolist()
113
+
114
+ # 因变量(包含个体随机效应)
115
+ entity_effects = np.random.normal(0, 1, n_entities)
116
+ y = []
117
+ for i in range(n):
118
+ entity_idx = i // n_periods
119
+ y_value = 1 + 2 * x[i][0] + 1.5 * x[i][1] + entity_effects[entity_idx] + np.random.normal(0, 0.5)
120
+ y.append(y_value)
121
+
122
+ try:
123
+ result = random_effects_model(
124
+ y=y,
125
+ x=x,
126
+ entity_ids=entity_ids,
127
+ time_periods=time_periods
128
+ )
129
+ print(f" 系数: {result.estimate:.4f}")
130
+ print(f" 标准误: {result.std_error:.4f}")
131
+ print(f" p值: {result.p_value:.4f}")
132
+ print(" ✓ 随机效应模型测试通过\n")
133
+ except Exception as e:
134
+ print(f" ✗ 随机效应模型测试失败: {e}\n")
135
+
136
+
137
+ def test_first_difference():
138
+ """测试一阶差分模型"""
139
+ print("测试一阶差分模型...")
140
+ np.random.seed(42)
141
+ n_entities = 10
142
+ n_periods = 5
143
+ n = n_entities * n_periods
144
+
145
+ # 生成面板数据
146
+ entity_ids = [f"entity_{i}" for i in range(n_entities) for _ in range(n_periods)]
147
+ x = np.cumsum(np.random.normal(0, 1, n)) # 随时间累积的变量
148
+ y = 2 + 1.5 * x + np.random.normal(0, 1, n) # 因变量
149
+
150
+ try:
151
+ result = first_difference_model(
152
+ y=y.tolist(),
153
+ x=x.tolist(),
154
+ entity_ids=entity_ids
155
+ )
156
+ print(f" 系数: {result.estimate:.4f}")
157
+ print(f" 标准误: {result.std_error:.4f}")
158
+ print(f" p值: {result.p_value:.4f}")
159
+ print(" ✓ 一阶差分模型测试通过\n")
160
+ except Exception as e:
161
+ print(f" ✗ 一阶差分模型测试失败: {e}\n")
162
+
163
+
164
+ def test_hausman_test():
165
+ """测试Hausman检验"""
166
+ print("测试Hausman检验...")
167
+ np.random.seed(42)
168
+ n_entities = 10
169
+ n_periods = 5
170
+ n = n_entities * n_periods
171
+
172
+ # 生成面板数据
173
+ entity_ids = [f"entity_{i}" for i in range(n_entities) for _ in range(n_periods)]
174
+ time_periods = [f"period_{t}" for _ in range(n_entities) for t in range(n_periods)]
175
+
176
+ # 设计协变量
177
+ x = np.random.normal(0, 1, (n, 2))
178
+
179
+ # 添加与个体效应相关的协变量(用于触发内生性)
180
+ entity_effects = np.random.normal(0, 1, n_entities)
181
+ correlation_with_entity = 0.5 # 引入部分相关性
182
+ x[:, 0] += correlation_with_entity * np.repeat(entity_effects, n_periods)
183
+
184
+ # 因变量
185
+ y = []
186
+ for i in range(n):
187
+ entity_idx = i // n_periods
188
+ y_value = (1 + 2 * x[i, 0] + 1.5 * x[i, 1] +
189
+ entity_effects[entity_idx] + np.random.normal(0, 0.5))
190
+ y.append(y_value)
191
+
192
+ try:
193
+ result = hausman_test(
194
+ y=y,
195
+ x=x.tolist(),
196
+ entity_ids=entity_ids,
197
+ time_periods=time_periods
198
+ )
199
+ if hasattr(result, 'hausman_statistic') and result.hausman_statistic >= 0:
200
+ print(f" Hausman统计量: {result.hausman_statistic:.4f}")
201
+ print(f" p值: {result.p_value:.4f}")
202
+ print(f" 解释: {result.interpretation}")
203
+ print(" ✓ Hausman检验测试通过\n")
204
+ else:
205
+ print(f" ✗ Hausman检验返回无效统计量: {result.hausman_statistic if hasattr(result, 'hausman_statistic') else 'None'}\n")
206
+ except Exception as e:
207
+ print(f" ✗ Hausman检验测试失败: {type(e).__name__}: {e}\n")
208
+
209
+
210
+ def test_difference_in_differences():
211
+ """测试双重差分法"""
212
+ print("测试双重差分法...")
213
+ np.random.seed(42)
214
+ n = 200
215
+
216
+ # 生成数据
217
+ treatment = np.concatenate([np.zeros(100), np.ones(100)]).tolist()
218
+ time_period = np.concatenate([np.zeros(50), np.ones(50), np.zeros(50), np.ones(50)]).tolist()
219
+
220
+ # 结果变量
221
+ outcome = []
222
+ for i in range(n):
223
+ if treatment[i] == 0 and time_period[i] == 0:
224
+ outcome.append(np.random.normal(10, 1))
225
+ elif treatment[i] == 0 and time_period[i] == 1:
226
+ outcome.append(np.random.normal(10, 1))
227
+ elif treatment[i] == 1 and time_period[i] == 0:
228
+ outcome.append(np.random.normal(10, 1))
229
+ else: # treatment[i] == 1 and time_period[i] == 1
230
+ outcome.append(np.random.normal(12, 1)) # 处理效应为2
231
+
232
+ try:
233
+ result = difference_in_differences(
234
+ treatment=treatment,
235
+ time_period=time_period,
236
+ outcome=outcome
237
+ )
238
+ print(f" DID估计: {result.estimate:.4f}")
239
+ print(f" 标准误: {result.std_error:.4f}")
240
+ print(f" p值: {result.p_value:.4f}")
241
+ print(" ✓ 双重差分法测试通过\n")
242
+ except Exception as e:
243
+ print(f" ✗ 双重差分法测试失败: {e}\n")
244
+
245
+
246
+ def test_triple_difference():
247
+ """测试三重差分法"""
248
+ print("测试三重差分法...")
249
+ np.random.seed(42)
250
+ n = 400
251
+
252
+ # 生成变量
253
+ treatment_group = np.tile([0, 0, 1, 1], n//4).tolist()
254
+ time_period = np.tile([0, 1, 0, 1], n//4).tolist()
255
+ cohort_group = np.tile([0, 0, 0, 0, 1, 1, 1, 1], n//8).tolist()
256
+
257
+ # 结果变量
258
+ outcome = []
259
+ for i in range(n):
260
+ if treatment_group[i] == 1 and time_period[i] == 1 and cohort_group[i] == 1:
261
+ outcome.append(np.random.normal(12, 1)) # 处理效应
262
+ else:
263
+ outcome.append(np.random.normal(10, 1))
264
+
265
+ try:
266
+ result = triple_difference(
267
+ outcome=outcome,
268
+ treatment_group=treatment_group,
269
+ time_period=time_period,
270
+ cohort_group=cohort_group
271
+ )
272
+ print(f" DDD估计: {result.estimate:.4f}")
273
+ print(f" 标准误: {result.std_error:.4f}")
274
+ print(f" p值: {result.p_value:.4f}")
275
+ print(" ✓ 三重差分法测试通过\n")
276
+ except Exception as e:
277
+ print(f" ✗ 三重差分法测试失败: {e}\n")
278
+
279
+
280
+ def test_regression_discontinuity():
281
+ """测试断点回归设计"""
282
+ print("测试断点回归设计...")
283
+ np.random.seed(42)
284
+ n = 200
285
+ cutoff = 0.0
286
+
287
+ # 运行变量
288
+ running_variable = np.random.uniform(-1, 1, n).tolist()
289
+
290
+ # 结果变量 - 在断点处有跳跃
291
+ outcome = []
292
+ for r in running_variable:
293
+ if r >= cutoff:
294
+ outcome.append(2 + 1.5 * r + np.random.normal(0, 0.5) + 1.0) # +1.0是处理效应
295
+ else:
296
+ outcome.append(2 + 1.5 * r + np.random.normal(0, 0.5))
297
+
298
+ try:
299
+ result = regression_discontinuity(
300
+ running_variable=running_variable,
301
+ outcome=outcome,
302
+ cutoff=cutoff,
303
+ bandwidth=0.5
304
+ )
305
+ print(f" RDD估计: {result.estimate:.4f}")
306
+ print(f" 标准误: {result.std_error:.4f}")
307
+ print(f" p值: {result.p_value:.4f}")
308
+ print(" ✓ 断点回归设计测试通过\n")
309
+ except Exception as e:
310
+ print(f" ✗ 断点回归设计测试失败: {e}\n")
311
+
312
+
313
+ def test_propensity_score_matching():
314
+ """测试倾向得分匹配"""
315
+ print("测试倾向得分匹配...")
316
+ np.random.seed(42)
317
+ n = 200
318
+
319
+ # 协变量
320
+ x1 = np.random.normal(0, 1, n)
321
+ x2 = np.random.normal(0, 1, n)
322
+ covariates = np.column_stack([x1, x2]).tolist()
323
+
324
+ # 倾向得分
325
+ pscore = 1 / (1 + np.exp(-(0.5 * x1 + 0.3 * x2)))
326
+ treatment = (np.random.uniform(0, 1, n) < pscore).astype(int).tolist()
327
+
328
+ # 结果变量
329
+ outcome = (2 + 1.5 * np.array(treatment) + 0.8 * x1 + 0.5 * x2 +
330
+ np.random.normal(0, 1, n)).tolist()
331
+
332
+ try:
333
+ result = propensity_score_matching(
334
+ treatment=treatment,
335
+ outcome=outcome,
336
+ covariates=covariates
337
+ )
338
+ print(f" ATE: {result.ate:.4f}")
339
+ print(f" 标准误: {result.std_error:.4f}")
340
+ print(f" p值: {result.p_value:.4f}")
341
+ print(" ✓ 倾向得分匹配测试通过\n")
342
+ except Exception as e:
343
+ print(f" ✗ 倾向得分匹配测试失败: {e}\n")
344
+
345
+
346
+ def test_mediation_analysis():
347
+ """测试中介效应分析"""
348
+ print("测试中介效应分析...")
349
+ np.random.seed(42)
350
+ n = 200
351
+
352
+ # 处理变量
353
+ treatment = np.random.normal(0, 1, n).tolist()
354
+
355
+ # 协变量
356
+ x1 = np.random.normal(0, 1, n)
357
+ x2 = np.random.normal(0, 1, n)
358
+ covariates = np.column_stack([x1, x2]).tolist()
359
+
360
+ # 中介变量
361
+ mediator = (1 + 0.8 * np.array(treatment) + 0.3 * x1 + 0.2 * x2 +
362
+ np.random.normal(0, 1, n)).tolist()
363
+
364
+ # 结果变量
365
+ outcome = (2 + 1.2 * np.array(treatment) + 0.7 * np.array(mediator) +
366
+ 0.4 * x1 + 0.3 * x2 + np.random.normal(0, 1, n)).tolist()
367
+
368
+ try:
369
+ result = mediation_analysis(
370
+ outcome=outcome,
371
+ treatment=treatment,
372
+ mediator=mediator,
373
+ covariates=covariates
374
+ )
375
+ print(f" 直接效应: {result.direct_effect:.4f}")
376
+ print(f" 间接效应: {result.indirect_effect:.4f}")
377
+ print(f" 总效应: {result.total_effect:.4f}")
378
+ print(" ✓ 中介效应分析测试通过\n")
379
+ except Exception as e:
380
+ print(f" ✗ 中介效应分析测试失败: {e}\n")
381
+
382
+
383
+ def test_moderation_analysis():
384
+ """测试调节效应分析"""
385
+ print("测试调节效应分析...")
386
+ np.random.seed(42)
387
+ n = 200
388
+
389
+ # 预测变量
390
+ predictor = np.random.normal(0, 1, n).tolist()
391
+
392
+ # 调节变量
393
+ moderator = np.random.normal(0, 1, n).tolist()
394
+
395
+ # 协变量
396
+ x1 = np.random.normal(0, 1, n)
397
+ x2 = np.random.normal(0, 1, n)
398
+ covariates = np.column_stack([x1, x2]).tolist()
399
+
400
+ # 结果变量
401
+ outcome = (2 + 1.2 * np.array(predictor) + 0.8 * np.array(moderator) +
402
+ 0.5 * np.array(predictor) * np.array(moderator) +
403
+ 0.3 * x1 + 0.2 * x2 + np.random.normal(0, 1, n)).tolist()
404
+
405
+ try:
406
+ result = moderation_analysis(
407
+ outcome=outcome,
408
+ predictor=predictor,
409
+ moderator=moderator,
410
+ covariates=covariates
411
+ )
412
+ print(f" 主效应: {result.main_effect:.4f}")
413
+ print(f" 调节效应: {result.moderator_effect:.4f}")
414
+ print(f" 交互效应: {result.interaction_effect:.4f}")
415
+ print(" ✓ 调节效应分析测试通过\n")
416
+ except Exception as e:
417
+ print(f" ✗ 调节效应分析测试失败: {e}\n")
418
+
419
+
420
+ def main():
421
+ """主测试函数"""
422
+ print("开始全面测试所有因果识别策略方法...\n")
423
+
424
+ test_instrumental_variables()
425
+ test_control_function()
426
+ test_fixed_effects()
427
+ test_random_effects()
428
+ test_first_difference()
429
+ test_hausman_test()
430
+ test_difference_in_differences()
431
+ test_triple_difference()
432
+ test_regression_discontinuity()
433
+ test_propensity_score_matching()
434
+ test_mediation_analysis()
435
+ test_moderation_analysis()
436
+
437
+ print("所有测试完成!")
438
+
439
+
440
+ if __name__ == "__main__":
441
+ main()