在R中建模一个非常大的数据集(180万行×270列)
我正在使用内存为8 GB的
Windows 8操作系统.我有一个180万行x 270列的data.frame,我必须执行glm. (logit /任何其他分类)
我尝试使用ff和bigglm包来处理数据. 但我仍然面临错误“错误:无法分配大小为81.5 Gb的向量”的问题. 任何人都可以建议我用这么多行和列构建分类模型这个问题的解决方案吗? ** ** EDITS: 我在运行代码时没有使用任何其他程序. 我正在根据评论者的建议添加一些我正在使用的专栏进行复制. str(x[1:10,]) 'data.frame': 10 obs. of 270 variables: $OPEN_FLG : Factor w/ 2 levels "N","Y": 1 1 1 1 1 1 1 1 1 1 $new_list_id : Factor w/ 9 levels "0","3","5","6",..: 1 1 1 1 1 1 1 1 1 1 $new_mailing_id : Factor w/ 85 levels "1398","1407",..: 1 1 1 1 1 1 1 1 1 1 $NUM_OF_ADULTS_IN_HHLD : num 3 2 6 3 3 3 3 6 4 4 $NUMBER_OF_CHLDRN_18_OR_LESS: Factor w/ 9 levels "","0","1","2",..: 2 2 4 7 3 5 3 4 2 5 $OCCUP_DETAIL : Factor w/ 49 levels "","00","01","02",..: 2 2 2 2 2 2 2 21 2 2 $OCCUP_MIX_PCT : num 0 0 0 0 0 0 0 0 0 0 $PCT_CHLDRN : int 28 37 32 23 36 18 40 22 45 21 $PCT_DEROG_TRADES : num 41.9 38 62.8 2.9 16.9 ... $PCT_HOUSEHOLDS_BLACK : int 6 71 2 1 0 4 3 61 0 13 $PCT_OWNER_OCCUPIED : int 91 66 63 38 86 16 79 19 93 22 $PCT_RENTER_OCCUPIED : int 8 34 36 61 14 83 20 80 7 77 $PCT_TRADES_NOT_DEROG : num 53.7 55 22.2 92.3 75.9 ... $PCT_WHITE : int 69 28 94 84 96 79 91 29 97 79 $POSTAL_CD : Factor w/ 104568 levels "010011203","010011630",..: 23789 45173 32818 6260 88326 29954 28846 28998 52062 47577 $PRES_OF_CHLDRN_0_3 : Factor w/ 4 levels "","N","U","Y": 2 2 3 4 2 4 2 4 2 4 $PRES_OF_CHLDRN_10_12 : Factor w/ 4 levels "","Y": 2 2 4 3 3 2 3 2 2 3 [list output truncated] 这是我正在使用的代码示例. require(biglm) mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT,data = x) require(ff) x$id <- ffseq_len(nrow(x)) xex <- expand.ffgrid(x$id,ff(1:100)) colnames(xex) <- c("id","explosion.nr") xex <- merge(xex,x,by.x="id",by.y="id",all.x=TRUE,all.y=FALSE) mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT,data = xex) 问题是我得到相同的错误“错误:无法分配大小81.5 Gb的向量”. 请告诉我这是否足够,或者我是否应该包含有关问题的详细信息. 解决方法
我的印象是你没有使用ffbase :: bigglm.ffdf但是你想要.即以下将把你的所有数据放在RAM中,并使用biglm :: bigglm.function,这不是你想要的.
require(biglm) mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT,data = x) 你需要使用ffbase :: bigglm.ffdf,它在ffdf上以chunkwise方式工作.所以加载包ffbase,导出bigglm.ffdf. require(ffbase) mymodeldataset <- xex[c("OPEN_FLG","new_list_id","NUM_OF_ADULTS_IN_HHLD","OCCUP_MIX_PCT")] mymodeldataset$OPEN_FLG <- with(mymodeldataset["OPEN_FLG"],ifelse(OPEN_FLG == "Y",TRUE,FALSE)) mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT,data = mymodeldataset,family=binomial()) 说明: 如果这不起作用 – 我怀疑,这是因为你在RAM中有其他东西,你不知道.在那种情况下. require(ffbase) mymodeldataset <- xex[c("OPEN_FLG",FALSE)) ffsave(mymodeldataset,file = "mymodeldataset") ## Open R again require(ffbase) require(biglm) ffload("mymodeldataset") mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT,family=binomial()) 你离开了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |