热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何快速制作group_by和lm?

如何解决《如何快速制作group_by和lm?》经验,为你挑选了1个好方法。

这是一个样本.

df <- tibble(
      subject = rep(letters[1:7], c(5, 6, 7, 5, 2, 5, 2)),
      day = c(3:7, 2:7, 1:7, 3:7, 6:7, 3:7, 6:7),
      x1 = runif(32), x2 = rpois(32, 3), x3 = rnorm(32), x4 = rnorm(32, 1, 5))

df %>%
  group_by(subject) %>%
  summarise(
    coef_x1 = lm(x1 ~ day)$coefficients[2],
    coef_x2 = lm(x2 ~ day)$coefficients[2],
    coef_x3 = lm(x3 ~ day)$coefficients[2],
    coef_x4 = lm(x4 ~ day)$coefficients[2])

这个数据很小,所以性能不是问题.

但我的数据是如此之大,大约1,000,000行和200,000个主题,而且这段代码非常慢.

我认为原因不是lm速度,而是很多主题子集.



1> 李哲源..:

理论上

首先,您可以使用多个LHS拟合线性模型.

其次,显式数据拆分不是逐组回归的唯一方式(或推荐方式).参见R回归分析:分析某个种族的数据和R:为每个类别建立单独的模型.因此,建立你的模型作为cbind(x1, x2, x3, x4) ~ day * subject其中subject的一个因素变量.

最后,由于您有许多因子级别并且使用大型数据集,因此lm是不可行的.考虑使用speedglm::speedlmwith sparse = TRUEMatrixModels::glm4with sparse = TRUE.


事实上

既没有speedlm也没有glm4积极发展.它们的功能(在我看来)是原始的.

既不支持speedlm也不glm4支持多个LHS lm.所以,你需要做的4组独立的模型x1 ~ day * subjectx4 ~ day * subject代替.

这两个包背后有不同的逻辑sparse = TRUE.

speedlm首先使用标准构建密集设计矩阵model.matrix.default,然后用于is.sparse调查它是否稀疏.如果为TRUE,则后续计算可以使用稀疏方法.

glm4用于model.Matrix构造设计矩阵,可以直接构建稀疏的矩阵.

因此,与这个稀疏性问题speedlm一样糟糕并不奇怪lm,并且glm4是我们真正想要使用的那个.

glm4没有用于分析拟合模型的完整有用的通用函数集.您可以通过提取系数,拟合值和残差coef,fittedresiduals,但必须计算所有的统计数据(标准差,T统计量,F统计量等)全部由自己.这对于熟悉回归理论的人来说并不是什么大不了的事,但它仍然相当不方便.

glm4仍然希望您使用最佳模型公式,以便可以构造最稀疏的矩阵.传统~ day * subject的确不是一个好的.我应该稍后就此问题设置一个问答.基本上,如果你的公式有拦截并且因素是对比的,那么你就会失去稀疏性.这是我们应该使用的:~ 0 + subject + day:subject.


测试用 glm4

## use chinsoon12's data in his answer
set.seed(0L)
nSubj <- 200e3
nr <- 1e6
DF <- data.frame(subject = gl(nSubj, 5),
                 day = 3:7,
                 y1 = runif(nr), 
                 y2 = rpois(nr, 3), 
                 y3 = rnorm(nr), 
                 y4 = rnorm(nr, 1, 5))

library(MatrixModels)
fit <- glm4(y1 ~ 0 + subject + day:subject, data = DF, sparse = TRUE)

我的1.1GHz Sandy Bridge笔记本电脑需要大约6~7秒.让我们提取它的系数:

b <- coef(fit)

head(b)
#  subject1   subject2   subject3   subject4   subject5   subject6 
# 0.4378952  0.3582956 -0.2597528  0.8141229  1.3337102 -0.2168463 

tail(b)
#subject199995:day subject199996:day subject199997:day subject199998:day 
#      -0.09916175       -0.15653402       -0.05435883       -0.02553316 
#subject199999:day subject200000:day 
#       0.02322640       -0.09451542 

你可以这样做B <- matrix(b, ncol = 2),所以第一列是截距,第二列是斜率.


我的想法:我们可能需要更好的大回归包

glm4在这里使用并不比chinsoon12的data.table解决方案具有吸引力的优势,因为它基本上只是告诉你回归系数.它也比data.table方法慢一点,因为它计算拟合值和残差.

简单回归分析不需要适当的模型拟合程序.关于如何在这种回归中做一些奇特的东西,我有一些答案,比如数据框中所有变量之间的快速成对简单线性回归,其中还给出了有关如何计算所有统计数据的详细信息.但是当我写这个答案时,我正在考虑关于大回归问题的一般事情.我们可能需要更好的软件包,否则就无法完成个案编码.


回复OP

speedglm::speedlm(x1 ~ 0 + subject + day:subject, data = df, sparse = TRUE)给出错误:无法分配大小为74.5 Gb的向量

是的,因为它的sparse逻辑很糟糕.

MatrixModels::glm4(x1 ~ day * subject, data = df, sparse = TRUE)Cholesky中给出错误(crossprod(from),LDL = FALSE):internal_chm_factor:Cholesky分解失败

这是因为你只有一个数据subject.您需要至少两个数据才能适合一条线.这是一个例子(在密集设置中):

dat <- data.frame(t = c(1:5, 1:9, 1),
                  f = rep(gl(3,1,labels = letters[1:3]), c(5, 9, 1)),
                  y = rnorm(15))

级别"c" f只有一个基准/行.

X <- model.matrix(~ 0 + f + t:f, dat)
XtX <- crossprod(X)
chol(XtX)
#Error in chol.default(XtX) : 
#  the leading minor of order 6 is not positive definite

Cholesky因子分解无法解决排名不足的模型.如果我们使用lmQR分解,我们将看到一个NA系数.

lm(y ~ 0 + f + t:f, dat)
#Coefficients:
#      fa        fb        fc      fa:t      fb:t      fc:t  
# 0.49893   0.52066  -1.90779  -0.09415  -0.03512        NA  

我们只能估计水平"c"的截距,而不是斜率.

请注意,如果您使用该data.table解决方案,则最终会0 / 0计算此级别的斜率,最终结果为NaN.


更新:快速解决方案现已推出

查看快速分组 - 简单线性回归和一般配对简单线性回归.


推荐阅读
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
author-avatar
手浪用户2602928711
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有