Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使组队快速进行?_R_Performance_Regression_Linear Regression_Lm - Fatal编程技术网

R 如何使组队快速进行?

R 如何使组队快速进行?,r,performance,regression,linear-regression,lm,R,Performance,Regression,Linear Regression,Lm,这是一个样本 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) %>%

这是一个样本

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])
df%
分组依据(受试者)%>%
总结(
coef_x1=lm(x1~天)$系数[2],
coef_x2=lm(x2~天)$系数[2],
coef_x3=lm(x3~天)$系数[2],
coef_x4=lm(x4~天)$系数[2])
这个数据很小,所以性能不是问题

但是我的数据非常大,大约有1000000行和200000个主题,而这段代码非常慢

我认为原因不在于
lm
的速度,而在于理论上大量的主题子集

首先,你可以

其次,显式数据拆分不是分组回归的唯一方法(或推荐方法)。见和。因此,将您的模型构建为
cbind(x1,x2,x3,x4)~day*subject
,其中
subject
是一个因子变量

最后,由于您有许多因子级别,并且使用的数据集很大,
lm
是不可行的。考虑使用<代码> StaveGLM::SimultML<代码> >代码>稀疏= true,或<代码>矩阵::GLM4 <代码>稀疏= true


实际上
speedlm
glm4
均未处于积极开发阶段。在我看来,它们的功能是原始的

无论是
speedlm
还是
glm4
都不支持多个LHS作为
lm
。因此,您需要将4个独立的模型
x1~日*主题
改为
x4~日*主题

这两个包在
sparse=TRUE
后面有不同的逻辑

  • speedlm
    首先使用标准的
    model.matrix.default
    构建一个密集设计矩阵,然后使用
    is.sparse
    来调查它是否稀疏。如果为TRUE,则后续计算可以使用稀疏方法
  • glm4
    使用
    model.Matrix
    构建设计矩阵,可以直接构建稀疏矩阵
因此,在这个稀疏性问题中,
speedlm
lm
一样糟糕也就不足为奇了,
glm4
才是我们真正想要使用的

glm4
没有一套完整、有用的通用功能来分析已安装的车型。您可以通过
coef
fitted
residuals
提取系数、拟合值和残差,但必须自己计算所有统计数据(标准误差、t统计、F统计等)。对于熟悉回归理论的人来说,这并不是什么大不了的事,但仍然很不方便

glm4
仍然希望您使用最佳模型公式,以便构建最稀疏的矩阵。传统的~day*主题确实不是一个好主题。我可能应该稍后就这个问题进行问答。基本上,如果你的公式有截距并且因子是对比的,你就失去了稀疏性。这是我们应该使用的:
~0+subject+day:subject


使用
glm4的测试
f
的“c”级只有一个基准/行

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
我们只能估计“c”级的截距,而不是斜率

请注意,如果使用
data.table
解决方案,则在计算此标高的坡度时,最终结果为
0/0
,最终结果为
NaN


更新:快速解决方案现在可用
请查看。

由于OP似乎只在寻找beta,因此这里有一种方法使用
数据。表
包只计算beta。有关公式,请参见参考资料

dt[, sumx := sum(day), by=.(subject)][,
    denom := sum(day^2) - sumx^2 / .N, by=.(subject)]

dt[, lapply(.SD, function(y) (sum(day*y) - (sumx[1L] * sum(y))/.N) / denom[1L]), 
    by=.(subject),
    .SDcols = paste0("y", 1:4)]
数据:


最快的方法是根本不使用
lm
,而是用一系列索引在Rcpp中实现它@李哲源, 我增加了一些时间安排。从技术上讲,它可以更快,但我不太确定如何做到这一点(即打开GForce)@李哲源, 是的,我刚看到。我简直受不了。将需要学习一切abt线性回归正确。都打开了,但还没有通过@李哲源, 我可以通过电子邮件联系你吗?关于回归@李哲源, 你什么时候毕业?
speedglm::speedlm(x1~day*subjectm,data=df,sparse=TRUE)
给出
错误:无法分配大小为74.5的向量
给出Cholesky中的
错误(crossprod(from),LDL=FALSE):internal\u chm\u factor:Cholesky分解失败
这是一个非常有用的答案!!我的R技能还不能处理Rcpp,但我可以看到我必须学习的新领域。我将从现在开始学习。
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))
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
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  
dt[, sumx := sum(day), by=.(subject)][,
    denom := sum(day^2) - sumx^2 / .N, by=.(subject)]

dt[, lapply(.SD, function(y) (sum(day*y) - (sumx[1L] * sum(y))/.N) / denom[1L]), 
    by=.(subject),
    .SDcols = paste0("y", 1:4)]
library(data.table)

set.seed(0L)
nSubj <- 200e3
nr <- 1e6
dt <- data.table(
    subject = rep(1:nSubj, each=5),
    day = 3:7,
    y1 = runif(nr), 
    y2 = rpois(nr, 3), 
    y3 = rnorm(nr), 
    y4 = rnorm(nr, 1, 5))
dt2 <- copy(dt)
 system.time({
      dt[, lapply(.SD, function(y) cov(x,y) / var(x) ), 
          by=.(subject), 
          .SDcols=paste0("y", 1:4)]
  })
   user  system elapsed 
  73.96    0.00   74.15 


  system.time({
      dt2[, sumx := sum(day), by=.(subject)][,
          denom := sum(day^2) - sumx^2 / .N, by=.(subject)]

      dt2[, lapply(.SD, function(y) (sum(day*y) - (sumx[1L] * sum(y))/.N) / denom[1L]), 
          by=.(subject),
          .SDcols = paste0("y", 1:4)]
  })
   user  system elapsed 
   2.14    0.00    2.14