如何在R中为每个玩家运行lm模型并生成新数据框
问题描述
我们有包含玩家ID、游戏时长和得分的数据框,需要为每位玩家拟合回归模型:ln(score)_t = β₁ + β₂time_playing
最终要生成只包含玩家ID和对应β₂系数的数据框,格式如下:
df player beta_2 1 a 0.005958000 2 b -0.004110000 3 c 0.000390777
数据加载代码及结构如下:
library(tidyverse) library(broom) df_players <- read.csv("https://github.com/rhozon/datasets/raw/master/data_test_players.csv", head = TRUE, sep = ";") %>% glimpse()
数据结构:
Rows: 105 Columns: 3 $ player <chr> "a", "a", "a", ... $ time_playing <int> 1, 2, 3, ... $ score <int> 7, 5, 2, ...
解决方案
可以利用dplyr的分组功能结合broom::tidy()批量处理每个玩家的回归模型,提取所需系数:
# 加载必要包 library(tidyverse) library(broom) # 读取数据 df_players <- read.csv("https://github.com/rhozon/datasets/raw/master/data_test_players.csv", head = TRUE, sep = ";") # 分组拟合模型并提取β₂系数 result_df <- df_players %>% group_by(player) %>% # 对每组数据拟合回归模型,因变量取score的对数 do(tidy(lm(log(score) ~ time_playing, data = .))) %>% # 筛选出time_playing对应的系数行(即β₂) filter(term == "time_playing") %>% # 选择需要的列并重命名 select(player, beta_2 = estimate) %>% ungroup() # 查看结果 print(result_df)
代码说明
group_by(player):按玩家ID分组,后续操作针对单个玩家的数据独立执行do(tidy(lm(...))):对每组数据拟合回归模型,并用tidy()将模型结果转换为整洁的数据框格式filter(term == "time_playing"):筛选出自变量time_playing对应的系数行,也就是目标β₂select(player, beta_2 = estimate):保留玩家ID列,将系数值列重命名为beta_2ungroup():取消分组,得到普通格式的结果数据框
运行上述代码后,即可得到符合期望格式的结果。
内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon
相关产品推荐
相关产品推荐

