R语言:季度级数据聚合与线性模型拟合技术咨询
嘿,我来帮你一步步搞定这两个任务!先从数据聚合开始,再聊聊怎么分析d1、d2对y占比的影响~
任务1:季度级别y=1实体占比的聚合计算
用dplyr做这个聚合其实很简洁,核心思路是按季度分组,然后计算每个季度内y=1的实体比例。假设你的数据集叫df,包含quarter(季度标识)、id(唯一实体ID)、y(二元结果变量)、d1和d2(实体特征虚拟变量)这些列,代码如下:
library(dplyr) # 生成季度级别的y=1占比统计 quarterly_y_stats <- df %>% # 按季度分组 group_by(quarter) %>% summarise( total_unique_entities = n_distinct(id), # 每个季度的唯一实体总数 y1_ratio = mean(y == 1, na.rm = TRUE) # y=1的实体占比,na.rm处理缺失值 ) # 如果y本身是0/1的数值型变量,直接用mean(y, na.rm=TRUE)更省事 # quarterly_y_stats <- df %>% group_by(quarter) %>% summarise(y1_ratio = mean(y, na.rm=TRUE))
这段代码会输出每个季度的唯一实体数量,以及对应y=1的实体占比。如果你的y是因子类型(比如"yes"/"no"),记得先转成数值型:y = as.numeric(y == "yes")。
任务2:分析d1、d2对季度y占比的影响
这里分两种常用的分析思路,你可以根据数据特点选择:
思路1:实体-季度层面的逻辑回归(精准捕捉个体效应)
因为y是二元变量,逻辑回归是最适合的模型。如果你的实体在多个季度都有数据,还可以加入季度固定效应来控制时间趋势,代码如下:
# 逻辑回归:分析d1、d2对y=1概率的影响,加入季度固定效应 logit_model <- glm( formula = y ~ d1 + d2 + factor(quarter), data = df, family = binomial(link = "logit") ) # 查看模型结果 summary(logit_model)
模型里的系数是对数发生比,如果想转换成更直观的概率变化,可以用marginaleffects包计算平均边际效应:
library(marginaleffects) # 计算d1、d2的平均边际效应(即d1/d2每变化1单位,y=1概率的平均变化) avg_margins <- avg_slopes(logit_model, variables = c("d1", "d2")) print(avg_margins)
思路2:先聚合到季度-特征组,再做加权线性回归
如果你更关注季度层面的占比变化和特征的关系,可以先按季度+d1+d2分组,计算每个组的y占比,再用加权线性回归(用组内实体数做权重,避免样本量小的组干扰结果):
# 第一步:聚合到季度-特征组 grouped_quarterly <- df %>% group_by(quarter, d1, d2) %>% summarise( y1_ratio = mean(y == 1, na.rm = TRUE), group_entity_count = n_distinct(id), # 组内实体数量,用于加权 .groups = "drop" # 取消分组,方便后续回归 ) # 第二步:加权线性回归 weighted_lm_model <- lm( formula = y1_ratio ~ d1 + d2 + factor(quarter), data = grouped_quarterly, weights = group_entity_count # 用实体数加权,提升结果可靠性 ) summary(weighted_lm_model)
这个模型的系数可以直接解释:比如d1的系数是0.1,意味着d1=1的实体组,y=1的占比平均比d1=0的组高10个百分点。
额外注意点
- 如果
d1和d2存在交互效应(比如d1的影响在d2不同取值下不一样),可以在模型里加入d1:d2项; - 如果实体有固定的未观测特征(比如不同实体本身的差异),可以考虑用面板数据模型(比如
plm包的固定效应logit); - 先检查数据里的缺失值,用
na.omit(df)或者df %>% drop_na()处理后再建模。
内容的提问来源于stack exchange,提问作者kathystehl
相关产品推荐
相关产品推荐

