首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一行代码搞定分组回归

一行代码搞定分组回归

作者头像
用户7652506
发布于 2020-10-23 08:29:59
发布于 2020-10-23 08:29:59
3.7K0
举报

在前面

在目前为止所有小伙伴们向大猫请教过的R问题中,大猫总结了最常遇见同时也是比较难的三个问题,分别是(1)事件研究法;(2)分组回归;(3)滚动回归。事件研究法在第一期中已经讲述,本期我们就来瞧瞧如何做分组回归~

PS:由于微信的限制,给大猫留言的小伙伴超过48小时后大猫就不能回复你们了。所以如果想联系大猫,可以按照文章最后的微信号加大猫微信哦。

题引入

很多时候我们需要处理的数据集中会有一个变量用于标记变量所在的组。例如下图中,stkid(我们可以把它想象成股票代码)有五种可能:a, b, c, d, e,每一个字母表示一只股票。y是因变量,可以想象成股票的日收益,x是自变量,可以想象成市场收益。我们希望对于每个股票,都跑一个如下回归:

y = x

并且把系数都保存在输出数据集中。

图:样例数据集

看似非常简单,但其实想要高效优美地实现是需要一定技巧滴。很多小伙伴大动干戈想把原数据集按照stkid的值拆成若干子数据集,并用for循环来做回归——大可不必这样。其实,要实现这一步只需要一行代码哦。

为了便于说明问题,我们先构造一个样例数据集:

# 确定随机数种子

# 想知道为什么要把42作为随机数种子?在google中输入“the answer to life the universe and everything”会有惊喜哦。

set.seed(42)

# 生成样例数据集dt,其一共有100行。stkid代表分组变量,有a, b, c, d, e五个类别;x和y分别随机生成

dt <- data.table(stkid = sample(letters[1:5], 100, replace = T), y = rnorm(100), x = rnorm(100))

要实现一行代码完成分组回归,需要用到data.table包!

骤分解

我们先把这一行优雅的代码放上来:

# result是输出数据集

result <- dt[, as.list(coef(lm(y ~ x, data = .SD))), keyby = .(stkid)]

最终的输出数据集是这个样子的:

现在我们逐一分析这一行代码。

  • keyby语句为data.table包中的分组语句,它能够对keyby中的每一个不同的值(这里为abcde)都分别跑一次回归。
  • ".SD"的含义是Subset of Data,每一个.SD都代表一个由keyby所决定的分组。具体而言,如果此时keyby语句循环到'a',那么.SD就表示原数据集中所有stkid == 'a'的行。在这里,.SD用来作为回归函数lm的输入数据集。
  • coef函数用来提取回归的系数。
  • 整行代码的关键在as.list函数。我们先看看如果不加as.list结果会是怎样的:

小伙伴们会发现此时每个组都有两行观测,其实他们分别对应着回归的intercept和coefficient。如果我们的回归不是单自变量而是双自变量,那么每个分组就会有三行观测了,一行是截距,还有两行是系数。

as.list的作用就在于,它把原来“竖着”的系数给“拉平”了,无论最终结果会出现几个系数,统统放到一行中显示。其中的原理是,data.table最终的输出必须是一个class为list的元素,符合条件的除了list自己,还包括 data.frame,data.table等。如果我们只加coef函数而不加as.list,那么最终输出的是一个vector,data.table会自动把这个vector拉直(也就是上图看到的这样),而加了as.list之后,原来输出vector就被打包成了list,变成了我们需要的样子。

这时有的小伙伴可能想问,有没有可能同时计算两个不同的回归方程?比如还是上面这个数据集,我想同时输出带系数的回归结果和不带系数的回归结果,应该怎么做?

还是只需要一行,大猫在这里给出答案(重点已经用红笔标出来啦):

result <- dt[, c(reg1 = as.list(coef(lm(y ~ x, .SD))), reg2 = as.list(coef(lm(y ~ x + 0, .SD)))), keyby = .(stkid)]

结果是:

是不是很神奇?至于原理,大家自己回去研究哦。

期预告

下期我们继续探索data.table包的强大功能,大猫教大家如何用一行代码搞定滚动回归!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的R语言课堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
10行代码搞定【滚动回归】
对于任意一天t,在[t - n, t]的区间内进行回归。如果数据一共有N天,那么就会得到N - n个数据点
用户7652506
2020/10/23
2.3K0
10行代码搞定【滚动回归】
35行代码搞定事件研究法(下)
Hello亲爱的小伙伴们,上期已经讲到如何对单一事件日计算超额收益,本期将会教大家如何针对多个股票多个事件日计算超额收益,Let's go!
用户7652506
2020/10/23
1.3K0
35行代码搞定事件研究法(下)
一行代码对日期插值
对日期进行插值是一项非常常见的任务。很多时候我们手头的时间序列都是不完整的,当中总会因为这样那样的原因漏了几天的观测,例如股票停牌了,观测仪器坏了,值班工人生病了等等。在分析时,我们为了获得完整的时间序列就需要“插入”那些丢失的日期。
用户7652506
2020/10/23
1.5K0
一行代码对日期插值
滚动回归中调用多核CPU
前几期的大猫课堂中大猫教了大家“10行代码搞定滚动回归”,在那一期的最后大猫说文章中给出的是目前大猫看到的最快的实现方法,“如果有发现更快方法的小伙伴一定要联系大猫”,emmmm……现在看来大猫不得不自己寻找更快的方法了,因为大猫前几天遇到了这样一个需求:需要处理大约2700个股票的120日滚动回归,每次滚动回归包含一个OLS以及一个GARCH拟合。按照平均每个股票7年历史,每年250个交易日来算,那就大约需要完成2700*7*250*2=940万次拟合!这个运算在大猫的i7 3.5G+32G+1T SSD的地球人上似乎要永远运行下去,于是大猫只得乖乖停止进程思考提高运算效率的办法。
用户7652506
2020/10/23
1.6K0
滚动回归中调用多核CPU
SAS or R:谁更适合你?(二)
本期开始大猫将直奔主题,从“语法灵活性(Syntax)”、“性能与并行计算(Performance & Parallel Computation)”、“商业/社区支持(Support)”三个方面比较不同统计软件。本期主题是“语法灵活性(Syntax)”,首先总结我们平时做的研究具有I/O Intensive以及Interactive的特点,然后告诉大家什么样的语法才最适合具有这些特点的研究工作。
用户7652506
2020/10/23
9280
SAS or R:谁更适合你?(二)
R练习50题 - 第七期
小编趁着刚打了疫苗,有点困,无法做脑力非常集中的事情,所以来更新一期,但绝对保质保量,希望大家能满意这一期!!
用户7652506
2021/04/26
4670
35行代码搞定事件研究法(上)
OK,按照上期的次回预告,这期大猫课堂将会教大家如何用35行R代码写出最有效率的事件研究法。
用户7652506
2020/10/23
1K0
35行代码搞定事件研究法(上)
如何用R进行中文分词?
Hello亲耐的小伙伴们!新一期的大猫课堂又和大家见面了。针对前几期课程,不少童鞋向大猫提出了一些非常好的建议,例如:把需要用到的包明确写出来,中间过程不要省略,增加一些基础知识的讲解等。大猫在这里由衷感谢所有提出建议的小伙伴们,同时向上几期的不尽人意之处表示歉意,我会继续努力哒!
用户7652506
2020/10/23
1.4K0
如何用R进行中文分词?
R练习50题 - 第六期
27. 每个行业每天成交额超过该行业中股票成交额80%分位数的股票的平均收益率是多少?
用户7652506
2021/04/26
5940
R练习50题 - 第三期
很久没有更新公众号了,这里大猫的R语言课堂给大家说声抱歉。由于两位作者这半年以来实在是太忙了,捱到了国庆假期,终于抽出时间来更新公众号,在此也祝各位水友双节快乐!!!
用户7652506
2020/10/10
8320
R练习50题 - 第三期
R练习50题 - 第九期
40. 每天分别有多少股票是最新5个交易日中至少有4个交易日的收益率超过当天市场平均收益率?
用户7652506
2021/07/23
3320
R练习50题 - 第二期
今天我们继续做题,由于整个题目按照从易到难排列,所以今天的题目并不会很难。先看一下预览:
用户7652506
2020/08/12
9260
R练习50题 - 第二期
ggstatsplot包: 一行代码搞定作图问题!
觉得基础作图的 R 代码太啰嗦,不成体系(R基础作图合集)?觉得 ggplot2 还是太复杂了不适合自己(ggplot2合集)?那有没有更简单点的?比如说,最好是躺着就能出图的那种。
庄闪闪
2021/06/25
3.8K0
ggstatsplot包: 一行代码搞定作图问题!
【进阶】Next N rows when condition is TRUE
本期的问题来自于stackoverflow.com,由于大猫实在想不出简洁的翻译,想来想去还是原标题最能描述问题,所以干脆直接借用。如果硬要翻译的话,大概就是“当某条件成立时,找到这个观测后N行的观测”。
用户7652506
2020/10/23
5820
【进阶】Next N rows when condition is TRUE
R练习50题 - 第八期
line 1 计算每只股票每天的收益率stkcd_ret和每个行业中各股票的流通市值权重ind_weight。
用户7652506
2021/07/23
4280
MADlib——基于SQL的数据挖掘解决方案(18)——回归之稳健方差
Robust Variance模块中的函数用于计算线性回归、逻辑回归、多类逻辑回归和Cox比例风险回归的稳健方差(Huber-White估计)。它们可用于计算具有潜在噪声异常值的数据集中数据的差异。此处实现的Huber-White与R模块“sandwich”中的“HC0”三明治操作完全相同。
用户1148526
2019/05/25
7830
R练习50题 - 第十一期
此题关键在于计算出每只股票每月的成交额,而后计算每个行业每天成交额,二者进行对比。
用户7652506
2021/07/23
4500
【技巧】如何快速按照日期分组
在处理数据的时候,我们常常需要按照日期对数据进行分类汇总,例如每周、每月、每年汇总等。常见的做法是建立一个用于分类的变量,然后再按照这个变量进行汇总。然而这种做法特别麻烦,因为我们常常要尝试多种不同的分类长度,很难事先就一次性创建好用于分类的变量。
用户7652506
2020/10/23
2.6K0
【技巧】如何快速按照日期分组
R Tricks: 如何巧为观测标记序号
本期大猫课堂将会开始一个新的系列:你不知道的R Tricks。这个系列将搬运stackoverflow.com(以后简称SO)上关于R数据处理的一些经典问答。大猫除了翻译原文,还会从初学者的角度为代码补充详细的解释。其实这些问题基本上都是大猫自己在数据处理过程中实际遇到的,看了SO上的答案不禁拍案叫绝,忍不住和大家分享。
用户7652506
2020/10/23
1.1K0
R Tricks: 如何巧为观测标记序号
能不能让R按行处理数据?
Hello亲爱的小伙伴们,大猫课堂又回来啦。从今天开始大猫会选择一些Stackoverflow.com上有关R数据处理的问答摘录给大家。这些问题都是在平日的工作中有很高可能性出现并且看似容易实则让人抓狂的问题,在Stackoverflow上他们有着很高的人气。事实上,这些问题也就是你在“看懂一本R的教材”和“成为R大神”之间的距离。大猫除了进行翻译,也会在其中增加一些相关知识点,相信掌握了这些问题,一定会对你的研究工作大有裨益。
用户7652506
2020/10/23
1.5K0
能不能让R按行处理数据?
相关推荐
10行代码搞定【滚动回归】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档