【问题标题】:how to regression with a categorical variable that has a lar如何使用具有 lar 的分类变量进行回归
【发布时间】:2020-01-25 12:29:30
【问题描述】:

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

我尝试过使用 R 和 Python

R

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

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

蟒蛇

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

内存错误

【问题讨论】:

  • 因为这两个错误消息都是关于大数和内存分配的,可能是什么原因?
  • 你的内存需求太高了。有一些包可以解决这个问题,比如 R 中的 biglm。
  • 算了。对具有 122k 级别的分类变量进行虚拟编码需要大量内存。但这不是你真正的问题。即使您有这种 RAM,生成的模型也将毫无用处。您需要一位顾问(统计学家或可能是机器学习专家)。
  • 您隐式指定的模型具有约 122k 系数(即一个截距,每个“名称”一个截距)。您可能至少需要重新考虑模型,您可能希望在其中进行一些正则化。如果您不这样做,那么只需为每个“名称”运行单独的回归,因为它与您的模型几乎相同(您当前正在修复所有名称的截距)

标签: python r python-3.x lm


【解决方案1】:

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

对于仅包含具有多个级别的单因子变量(虚拟变量)的 OLS,您实际估计的是组均值,在本例中为每个 name 的均值 y。大多数 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 平方

请注意,可以使用关系 Rsquared = 1 - SSE / SST = SSF / SST 简单地计算 R 平方。在单因子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

【讨论】:

  • 谢谢你的回答,我需要的重要的是r2的值。
  • 这可以使用1 - explained variance / total variance 计算,您可以用类似的方式计算。像……(餐巾纸背面)sst &lt;- var(mtcars$mpg); ssf &lt;- var(ave(mtcars$mpg, mtcars$cyl, FUN = mean); r2 &lt;- ssf/sst
  • 示例已添加到答案中。请记住给有用的答案投赞成票,并将完全回答问题的答案打上“已回答”的勾号,以向其他人表明这有助于解决您遇到的问题。 :-)
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2016-03-12
  • 1970-01-01
  • 2022-11-29
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多