1.数据处理
- 连续变量:缩尾处理(1%,99%)
from scipy.stats.mstats import winsorize win_ESG = winsorize(ESG, limits=[0.01, 0.01])
- 虚拟变量:如处理年份2012-2020
nominal_year = pd.get_dummies(year) nominal_year.drop(columns=[2020], axis=1, inplace=True) nominal_year.columns = ['2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']
- 描述性统计
# 打乱顺序 shuffle_data = data.sample(frac=1) print(shuffle_data.describe())
- 相关性分析
# 皮尔逊相关性分析 data_corr = data.corr(method='pearson') print(data_corr) # 显著性检验 for i in range(0, len(data)): for j in range(0, i + 1): print('{}和{}的pearson系数和p值为:{}'.format(data.columns[i], data.columns[j], scipy.stats.pearsonr(data.iloc[:, i], data.iloc[:, j]))) j += 1 i += 1
2.多元回归分析
- 定义OLS模型
import statsmodels.formula.api as sm # 因变量 ~ 自变量 + 控制变量 formulation = 'ESG_R ~ INS+Size+Age+Lev+Growth+ROA+PE+Radio+Balance+DR+MKTB+SGROW' # 控制年份 for i in range(len(list(nominal_year.columns))): formulation += '+Q("{}")'.format(nominal_year.columns[i]) # 控制行业 nominal_industry = pd.get_dummies(industry) nominal_industry.drop(columns=[nominal_industry.columns[-1]], axis=1, inplace=True) for i in range(len(list(nominal_industry.columns))): formulation += '+Q("{}")'.format(nominal_industry.columns[i]) # OLS lm = sm.ols(formulation, data=data) model = lm.fit() print(model.summary())
3.稳健性检验
- 替换因变量
- 固定效应模型
- 内生性检验:滞后因变量/PSM/Heckman两阶段法/工具变量法
# PSM 待补充 # Heckman两阶段法 model = ‘自变量 ~ 工具变量 + 控制变量’ # 第一步 probit_model = sm.probit(model, data) print(result.summary()) result = probit_model.fit() coef = result.params # coef 为按照model中工具变量-控制变量的顺序对应的系数 # 计算imr=coef[0]+coef[1]*工具变量+coef[2]*控制变量+... 略 imr = pd.Dataframe(imr) imr.columns = ['IMR'] data = pd.concat(objs=[data, imr], axis='columns') # 第二步 model = ‘因变量 ~ 自变量+ IMR + 控制变量’
需要注意的是,在Heckman中,如果自变量是连续变量而非0-1变量,在进行第一步probit模型时,需要额外进行转换,例如可以根据中位数以上/以下转换为1/0。
4.中介机制研究
第一步:中介机制 ~ 自变量 + 控制变量
第二步:因变量 ~ 中介机制 + 自变量 + 控制变量