为什么model.matrix这么慢?

为什么model.matrix这么慢?,r,matrix,lm,model.matrix,R,Matrix,Lm,Model.matrix,考虑以下演示数据: set.seed(1) n <- 1000000 x1 <- rnorm(n) x2 <- rnorm(n) x3 <- rnorm(n) 但如果我对matrix也这么做,它会非常快: system.time(mt2 <- matrix(c(rep(1, n), x1, x2, x3), byrow=FALSE, ncol=4)) usuário sistema decorrido 0.085 0.021 0.105

考虑以下演示数据:

set.seed(1)
n <- 1000000
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
但如果我对matrix也这么做,它会非常快:

system.time(mt2 <- matrix(c(rep(1, n), x1, x2, x3), byrow=FALSE, ncol=4))
 usuário   sistema decorrido 
  0.085     0.021     0.105 
为什么不同?是什么使model.matrix变慢对lm和相关功能来说真的是必要的?

使用debugoncemodel.matrix.default,并在其中使用TraceMData

model.matrix.default调用model.frame,后者返回data.frame。在model.matrix.default中,此data.frame至少复制3次

为什么lm使用model.matrix->lm通常以data.frame、list或environment作为数据参数调用。model.frame并返回data.frame可确保通过后续对lm的调用找到公式中的术语,并将引用相同的值。

使用debugoncemodel.matrix.default,并在此范围内使用TraceMData

model.matrix.default调用model.frame,后者返回data.frame。在model.matrix.default中,此data.frame至少复制3次

为什么lm使用model.matrix->lm通常以data.frame、list或environment作为数据参数调用。model.frame并返回data.frame可确保通过后续对lm的调用找到公式中的术语,并将引用相同的值。

通常,对libraryutils中Rprof的调用(默认情况下应位于搜索路径上)将说明函数调用中时间开销的来源:

Rprof("Rprof.out")
m1 <- model.matrix( ~ x1 + x2 + x3)
Rprof(NULL)
summaryRprof("Rprof.out")
因此,在使用na.omit.data.frame检查NAs和使用na.omit.data.frame对data.frame进行子集设置时,需要花费大量时间[.data.frame,在model.frame.default内。时间的比例将根据样本大小n而变化,但对于大样本大小,时间的比例将趋于一个极限。

一般来说,在libraryutils中调用Rprof(默认情况下应位于搜索路径上)将说明函数调用中时间开销的来源:

Rprof("Rprof.out")
m1 <- model.matrix( ~ x1 + x2 + x3)
Rprof(NULL)
summaryRprof("Rprof.out")

因此,在使用na.omit.data.frame检查NAs和使用na.omit.data.frame对data.frame进行子集设置时,需要花费大量时间[.data.frame,在model.frame.default内。时间比例将根据样本大小n而变化,但对于大样本大小,时间比例将趋于限制。

Matrix只是生成现有元素的矩阵。不执行任何操作。请尝试DebugonStats:::model.Matrix.default并逐步查看它正在做多少。我做到了。它成功了没有对主题进行太多说明。Matrix只是对现有元素进行了一个矩阵。没有执行任何操作。请尝试DebugonStats:::model.Matrix.default并逐步查看它所做的工作。我做到了。它没有对主题进行太多说明。这些操作似乎是大数据集的瓶颈。请尝试使用10百万OB。@carloscinelli,对于大数据集,无论如何使用都可能是一个更好的主意。这些操作似乎是大数据集的一个瓶颈。尝试使用1000万OB。@carloscinelli,对于大数据集,无论如何使用都可能是一个更好的主意
> summaryRprof("Rprof.out")
$by.self
                        self.time self.pct total.time total.pct
"model.matrix.default"       0.12    42.86       0.28    100.00
"na.omit.data.frame"         0.06    21.43       0.14     50.00
"[.data.frame"               0.04    14.29       0.08     28.57
"anyDuplicated.default"      0.04    14.29       0.04     14.29
"as.list.data.frame"         0.02     7.14       0.02      7.14

$by.total
                        total.time total.pct self.time self.pct
"model.matrix.default"        0.28    100.00      0.12    42.86
"model.matrix"                0.28    100.00      0.00     0.00
"na.omit.data.frame"          0.14     50.00      0.06    21.43
"model.frame"                 0.14     50.00      0.00     0.00
"model.frame.default"         0.14     50.00      0.00     0.00
"na.omit"                     0.14     50.00      0.00     0.00
"[.data.frame"                0.08     28.57      0.04    14.29
"["                           0.08     28.57      0.00     0.00
"anyDuplicated.default"       0.04     14.29      0.04    14.29
"anyDuplicated"               0.04     14.29      0.00     0.00
"as.list.data.frame"          0.02      7.14      0.02     7.14
"as.list"                     0.02      7.14      0.00     0.00
"vapply"                      0.02      7.14      0.00     0.00

$sample.interval
[1] 0.02

$sampling.time
[1] 0.28