我有一个数据框(1000000个观测值),带有2个变量y(工资)和名称(122000个名称,我想用“名称”解释“ y”)
我尝试过R和Python
mod<-lm(y~names,data=pop1)
R:消息错误:无法分配大小为111.0 Gb的向量
fit = ols('y ~ C(names)', data=pop1).fit()
的MemoryError
您的问题是(由于注释在咆哮)您缺少执行计算的内存。另一个非常重要的一点是为什么要执行回归?
对于仅包含具有多个级别的单个因子变量(虚拟变量)的OLS,您实际上要估算的是组平均值,在这种情况下,每个y
的平均值name
。大多数LS实现使用QR
分解并创建一个对比度设计矩阵,这意味着截距是第一组的平均值,而其他系数是与截距不同的差平均值。 R
的lm
功能就是这种情况。但是,如果我们确实想要的话,我们仍然可以取出系数,计算R平方等。为了说明,这里是使用mtcars
数据集的示例
data(mtcars)
fit <- lm(mpg ~factor(cyl), data = mtcars)
coefs <- tapply(mtcars$mpg, mtcars$cyl, mean)
intercept <- coefs[1]
beta <- c(intercept, coefs[-1] - intercept)
names(beta) <- c("(Intercept)", paste0("cyl", levels(factor(mtcars$cyl))[-1]))
beta
#output
(Intercept) cyl4 cyl8
26.663636 -6.920779 -11.563636
coef(fit)
#output
(Intercept) factor(cyl)6 factor(cyl)8
26.663636 -6.920779 -11.563636
#output
all.equal(coef(fit), out, check.attributes = FALSE)
[1] TRUE
R平方也同样计算。
但是您又真的想估算什么?在这种情况下,线性回归有点过大。
注意,R平方可以简单地使用关系Rsquared = 1 - SSE / SST = SSF / SST
计算。在单个因子SSF = var(fitted)
且始终为SST = var(predictor)
的情况下,可以通过
fitted <- ave(mtcars$mpg, mtcars$cyl, FUN = mean)
ssf <- var(fitted)
sst <- var(mtcars$mpg)
r2 <- ssf / sst
all.equal(r2, summary(fit)$r.squared)
[1] TRUE