用 R 中的数百万个观测值和数千个变量估计 OLS 模型

雷纳托

我正在尝试使用 biglm 估计具有约 100 万个观测值和约 50,000 个变量的大型 OLS 回归。

我计划使用每个大约 100 个观察的块来运行每个估计。我用一个小样本测试了这个策略,效果很好。

但是,使用真实数据时,我在尝试定义 biglm 函数的公式时收到“错误:保护():保护堆栈溢出”。

我已经试过了:

  • 以 --max-ppsize=50000 开始 R

  • 设置选项(表达式 = 50000)

但错误仍然存​​在

我在 Windows 上工作并使用 Rstudio

# create the sample data frame (In my true case, I simply select 100 lines from the original data that contains ~1,000,000 lines)
DF <- data.frame(matrix(nrow=100,ncol=50000))
DF[,] <- rnorm(100*50000)
colnames(DF) <- c("y", paste0("x", seq(1:49999)))

# get names of covariates
my_xvars <- colnames(DF)[2:( ncol(DF) )]

# define the formula to be used in biglm
# HERE IS WHERE I GET THE ERROR :
my_f <- as.formula(paste("y~", paste(my_xvars, collapse = " + ")))

编辑 1:我练习的最终目标是估计所有 50,000 个变量的平均影响。因此,简化模型选择更少的变量并不是我现在正在寻找的解决方案。

本博克

第一个瓶颈(我不能保证不会有其他瓶颈)是在公式的构建中。R 不能从文本中构建一个很长的公式(细节太难看,现在无法探索)。下面我展示了一个黑客版本的biglm代码,它可以直接获取模型矩阵X和响应变量y,而不是使用公式来构建它们。然而:下一个瓶颈是内部函数biglm:::bigqr.init(),它获取的内部调用biglm,尝试分配大小的数值向量choose(nc,2)=nc*(nc-1)/2(这里nc是列数当我试着使用50000列,我得到。

错误:无法分配大小为 9.3 Gb 的向量

nc25000时需要 2.3Gb )。下面的代码在我的笔记本电脑上运行时nc <- 10000

我对这种方法有一些警告:

  • 由于上述问题,除非您有至少 10G 的内存,否则您将无法处理 50000 列的问题。
  • biglm:::update.biglm会以平行的方式(这不应该是太硬)进行修改
  • 不知道 p>>n 问题(适用于拟合初始块的级别)是否会咬你在运行我下面的示例时(10 行,10000 列),除了 10 个参数外,所有参数都是NA. 我不知道这些NA值是否会污染结果,从而导致后续更新失败。如果是这样,我不知道是否有办法解决这个问题,或者它是否是根本性的(因此您nr>nc至少需要初始拟合)。(做一些小实验看看是否有问题会很简单,但我已经在这上面花了太长时间......)
  • 不要忘记,使用这种方法,您必须明确地向模型矩阵添加一个截距列(例如,X <- cbind(1,X)如果您想要一个。

示例(先将底部的代码另存为my_biglm.R):

nr <- 10
nc <- 10000
DF <- data.frame(matrix(rnorm(nr*nc),nrow=nr))

respvars <- paste0("x", seq(nc-1))
names(DF) <- c("y", respvars)

# illustrate formula problem: fails somewhere in 15000 < nc < 20000
try(reformulate(respvars,response="y"))

source("my_biglm.R")
rr <- my_biglm(y=DF[,1],X=as.matrix(DF[,-1]))

my_biglm <- function (formula, data, weights = NULL, sandwich = FALSE,
                      y=NULL, X=NULL, off=0) {
    if (!is.null(weights)) {
        if (!inherits(weights, "formula")) 
            stop("`weights' must be a formula")
        w <- model.frame(weights, data)[[1]]
    } else w <- NULL
    if (is.null(X)) {
        tt <- terms(formula)
        mf <- model.frame(tt, data)
        if (is.null(off <- model.offset(mf))) 
            off <- 0
        mm <- model.matrix(tt, mf)
        y <- model.response(mf) - off
    } else {
        ## model matrix specified directly
        if (is.null(y)) stop("both y and X must be specified")
        mm <- X
        tt <- NULL
    }
    qr <- biglm:::bigqr.init(NCOL(mm))
    qr <- biglm:::update.bigqr(qr, mm, y, w)
    rval <- list(call = sys.call(), qr = qr, assign = attr(mm, 
        "assign"), terms = tt, n = NROW(mm), names = colnames(mm), 
        weights = weights)
    if (sandwich) {
        p <- ncol(mm)
        n <- nrow(mm)
        xyqr <- bigqr.init(p * (p + 1))
        xx <- matrix(nrow = n, ncol = p * (p + 1))
        xx[, 1:p] <- mm * y
        for (i in 1:p) xx[, p * i + (1:p)] <- mm * mm[, i]
        xyqr <- update(xyqr, xx, rep(0, n), w * w)
        rval$sandwich <- list(xy = xyqr)
    }
    rval$df.resid <- rval$n - length(qr$D)
    class(rval) <- "biglm"
    rval
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从R中的rms包的ols()模型获取系数的p值

来自分类Dev

用R中的模型预测结果

来自分类Dev

R中的隐马尔可夫模型-用RHmm预测下一个观测

来自分类Dev

熊猫OLS随机效应模型-怪异的预测值

来自分类Dev

如何在统计模型中从OLS返回坡度

来自分类Dev

用另一个表中的线性模型用 R 进行预测

来自分类Dev

带索引解释变量(年)的OLS线性模型中的预测值

来自分类Dev

Statsmodels-Wald检验线性回归模型(OLS)中系数趋势的显着性

来自分类Dev

熊猫/统计模型OLS预测未来价值

来自分类Dev

熊猫/统计模型OLS预测未来价值

来自分类Dev

多个OLS估计TypeError

来自分类Dev

用R中的预测误差的最小值创建ARIMA模型

来自分类Dev

用OLS中的一阶自回归过程创建x

来自分类Dev

用Python进行OLS Breusch Pagan测试

来自分类Dev

用正则表达式替换csv中的数千个分隔符

来自分类Dev

用模型中的数百个问题表示表单的最佳方法是什么

来自分类Dev

OLS模型拟合返回的系数数量少于预期

来自分类Dev

用分类变量拟合nls模型

来自分类Dev

用模型和变量进行路由

来自分类Dev

用实体值填充DTO模型

来自分类Dev

Django-用值替换“模型对象”

来自分类Dev

用实体值填充DTO模型

来自分类Dev

用R绘制线性模型(lm)时产生的NaN

来自分类Dev

R 用置信区间绘制多个 locfit 模型

来自分类Dev

R-lm()中的OLS为矩阵计算提供了不同的答案

来自分类Dev

如何计算R中每人的多个观察数据以计算OLS和分位数回归?

来自分类Dev

用剃刀中的ajax更新模型

来自分类Dev

lapply:适合数千个混合模型并能够提取lsmeans

来自分类Dev

从包含数百万个文件的目录(bash / python / perl)中完全匹配地高效查找数千个文件

Related 相关文章

热门标签

归档