多年混合数据Logistic回归中匹配滞后一期因变量的实现方法
你之前直接对全列执行lag(df$Policy_Executive_Compensation_ESG_Performance)的方式存在核心问题:R默认按行顺序做滞后,不会区分企业主体,会把不同企业的观测错位匹配,完全不符合「同一家企业T期自变量对应T+1期因变量」的需求。
解决方法核心是先按企业分组,再做时序错位处理,具体操作如下:
步骤1:安装/加载必要工具包
用dplyr做分组处理最方便,代码如下:
install.packages("dplyr") # 未安装的话先执行这行 library(dplyr)
步骤2:预处理面板数据,生成匹配好的变量
我们可以直接把被解释变量提前1期(也就是取同一家企业下一年的观测值),这样每行的自变量都是T期、被解释变量都是T+1期,自动匹配:
df_processed <- df %>% group_by(Firm) %>% # 按企业分组,核心操作,避免跨企业错位 arrange(Year) %>% # 确保同企业下的年份按升序排列 # 生成提前1期的被解释变量,n=1表示提前1期 mutate(CSR_Contracting_next = lead(Policy_Executive_Compensation_ESG_Performance, n = 1)) %>% ungroup() %>% filter(!is.na(CSR_Contracting_next)) # 删掉没有下一期观测的样本(比如所有企业最后一年的观测)
如果你的面板是不平衡面板(部分企业缺失某些年份的观测),需要严格匹配间隔刚好1年的样本,可以加一步过滤:
df_processed <- df %>% group_by(Firm) %>% arrange(Year) %>% mutate( CSR_Contracting_next = lead(Policy_Executive_Compensation_ESG_Performance, n = 1), year_gap = lead(Year) - Year ) %>% ungroup() %>% filter(year_gap == 1, !is.na(CSR_Contracting_next))
步骤3:直接用处理好的数据集建模
建模时指定数据源即可,不需要重复加df$前缀:
mod1 <- glm(CSR_Contracting_next ~ ESG_Score + Environmental_Pillar_Score + Social_Pillar_Score + Board_Cultural_Diversity_Percent_Score + Board_Gender_Diversity_Percent_Score + Policy_Board_Diversity + CSR_Sustainability_External_Audit + ROA + Size + PTB_Ratio + Leverage + CSR_Sustainability_Committee + Independent_Board_Members + CEO_Chairman_Separation + Chairman_is_ex_CEO + Policy_Equal_Voting_Right + Shareholders_Approval_Stock_Comp_Plan + Policy_Executive_Retention + Compensation_Improvement_Tools + Executive_Compensation_Policy + CEO_Compensation_Link_to_TSR + Executive_Compensation_LT_Objectives + Shareholders_Vote_on_Executive_Pay + Veto_Power_or_Golden_share + SOE, data = df_processed, family = binomial, maxit = 100)
内容的提问来源于stack exchange,提问作者Ludovico
相关产品推荐
相关产品推荐

