如何使用具有类别的分类变量进行回归

问题描述 投票:-2回答:1

我有一个数据框(1000000个观测值),带有2个变量y(工资)和名称(122000个名称,我想用“名称”解释“ y”)

我尝试过R和Python

R

mod<-lm(y~names,data=pop1)

R:消息错误:无法分配大小为111.0 Gb的向量

fit = ols('y ~ C(names)', data=pop1).fit()

的MemoryError

python r python-3.x lm
1个回答
0
投票

您的问题是(由于注释在咆哮)您缺少执行计算的内存。另一个非常重要的一点是为什么要执行回归?

对于仅包含具有多个级别的单个因子变量(虚拟变量)的OLS,您实际上要估算的是组平均值,在这种情况下,每个y的平均值name。大多数LS实现使用QR分解并创建一个对比度设计矩阵,这意味着截距是第一组的平均值,而其他系数是与截距不同的差平均值。 Rlm功能就是这种情况。但是,如果我们确实想要的话,我们仍然可以取出系数,计算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平方

注意,R平方可以简单地使用关系Rsquared = 1 - SSE / SST = SSF / SST计算。在单个因子SSF = var(fitted)且始终为SST = var(predictor)的情况下,可以通过

来实现rsquared
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
© www.soinside.com 2019 - 2024. All rights reserved.