我一直认为lmR 中的函数非常快,但正如本例所示,使用solve函数计算的闭合解更快.
data<-data.frame(y=rnorm(1000),x1=rnorm(1000),x2=rnorm(1000))
X = cbind(1,data$x1,data$x2)
library(microbenchmark)
microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm(y ~ .,data=data))
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,如果这个玩具示例是一个坏的例子,或者情况lm实际上是慢的吗?
编辑:正如Dirk Eddelbuettel所建议的,由于lm需要解决公式,比较是不公平的,所以更好地使用lm.fit,不需要解决公式
microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm.fit(X,data$y))
Unit: microseconds
expr min lq mean median uq max neval cld
solve(t(X) %*% X, t(X) %*% data$y) 99.083 108.754 125.1398 118.0305 131.2545 236.060 100 a
lm.fit(X, y) 125.136 136.978 151.4656 143.4915 156.7155 262.114 100 b
Run Code Online (Sandbox Code Playgroud) 我试图用R做固定效应线性回归.我的数据看起来像
dte yr id v1 v2
. . . . .
. . . . .
. . . . .
Run Code Online (Sandbox Code Playgroud)
然后我决定通过制作yr一个因子并使用它来做到这一点lm:
lm(v1 ~ factor(yr) + v2 - 1, data = df)
Run Code Online (Sandbox Code Playgroud)
但是,这似乎耗尽了内存.我的因素有20个级别,df有1400万行,大约需要2GB才能存储,我在22 GB专用于这个过程的机器上运行它.
于是我决定尝试的东西的老式方法:为每一个我多年的虚拟变量t1来t20这样做:
df$t1 <- 1*(df$yr==1)
df$t2 <- 1*(df$yr==2)
df$t3 <- 1*(df$yr==3)
...
Run Code Online (Sandbox Code Playgroud)
并简单地计算:
solve(crossprod(x), crossprod(x,y))
Run Code Online (Sandbox Code Playgroud)
这没有问题,几乎立即产生答案.
我特别好奇当我能够很好地计算系数时,lm会使内存耗尽吗?谢谢.
我需要以下对角线:
diag(X %*% solve(A) %*% t(X))
Run Code Online (Sandbox Code Playgroud)
其中A是满秩矩阵,X是矩形矩阵.这两个A和X稀疏.
我知道发现矩阵的逆是坏的,除非你真的需要它.但是,我无法看到如何重写公式,以便用两个参数solve(A)替换solve,这样线性系统就可以在没有显式反转的情况下得到解决.那可能吗?
该问题涉及机器学习特征选择过程.
我有一个很大的特征矩阵 - 列是主题(行)的特征:
set.seed(1)
features.mat <- matrix(rnorm(10*100),ncol=100)
colnames(features.mat) <- paste("F",1:100,sep="")
rownames(features.mat) <- paste("S",1:10,sep="")
Run Code Online (Sandbox Code Playgroud)
S在不同条件(C)下测量每个受试者()的响应,因此看起来像这样:
response.df <-
data.frame(S = c(sapply(1:10, function(x) rep(paste("S", x, sep = ""),100))),
C = rep(paste("C", 1:100, sep = ""), 10),
response = rnorm(1000), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
所以我匹配的主题是response.df:
match.idx <- match(response.df$S, rownames(features.mat))
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种快速计算每个特征和响应的单变量回归的方法.
比这更快的东西?:
fun <- function(f){
fit <- lm(response.df$response ~ features.mat[match.idx,f])
beta <- coef(summary(fit))
data.frame(feature = colnames(features.mat)[f], effect = beta[2,1],
p.val = beta[2,4], stringsAsFactors = F))
}
res <- do.call(rbind, lapply(1:ncol(features.mat), …Run Code Online (Sandbox Code Playgroud)