Sql 规避R';if中的s`错误(nbins>;.Machine$integer.max)`
这是一个传奇故事,它是从家庭问题开始的。现在我似乎做得很正确,我遇到了一点麻烦(有关导入过程的详细信息以及Sql 规避R';if中的s`错误(nbins>;.Machine$integer.max)`,sql,r,memory,stata,Sql,R,Memory,Stata,这是一个传奇故事,它是从家庭问题开始的。现在我似乎做得很正确,我遇到了一点麻烦(有关导入过程的详细信息以及strata变量的来源,请参阅上一篇文章): 当这不起作用时,制表的整个源代码: > tabulate <- function(bin, nbins = max(1L, bin, na.rm=TRUE)) { if(!is.numeric(bin) && !is.factor(bin)) stop("'bin' must be numeric or
strata
变量的来源,请参阅上一篇文章):
当这不起作用时,制表的整个源代码:
> tabulate <- function(bin, nbins = max(1L, bin, na.rm=TRUE))
{
if(!is.numeric(bin) && !is.factor(bin))
stop("'bin' must be numeric or a factor")
#if (nbins > .Machine$integer.max)
if (nbins > 2^40) #replacement line
stop("attempt to make a table with >= 2^31 elements")
.C("R_tabulate",
as.integer(bin),
as.integer(length(bin)),
as.integer(nbins),
ans = integer(nbins),
NAOK = TRUE,
PACKAGE="base")$ans
}
我不知道用更多的内存是否能解决这个问题。我在有16个Gig的桌面上运行R
,我通过Windows服务器使用Stata
,目前将内存分配设置为2000MB,但理论上我可以尝试增加它
总而言之:
这是R
中的硬限制吗
sql
能解决我的R
问题吗
如果我把它分割成许多单独的文件,这会修复它(大量的工作…)
在Stata
上投入大量内存可以吗
我是不是真的找错人了
是的,R对向量使用32位索引,因此它们最多只能包含2^31-1个条目,并且您正在尝试使用2^40创建一些内容。有人说要引入64位索引,但在出现在R中之前还有一段路要走。向量有规定的硬限制,就基R而言就是这样
我不熟悉你在Q的其他部分提供进一步建议的细节
为什么要使用完整的数据集?一个适合你的小样本不是同样有用吗?您可以使用SQL存储所有数据,并从R查询数据,以返回一个更合适大小的随机子集。这个答案应该归功于@Gavin和@Martin,或者至少引导我走向正确的方向。我主要是单独回答,以便于阅读
按顺序我问:
是的,在R
中,2^31是一个硬限制,尽管它是什么类型似乎很重要(这有点奇怪,因为它是向量的长度,而不是内存量(我有很多)这就是问题所在。不要将地层
或id
变量转换为因子
,这只会固定变量的长度并消除子集的影响(这是解决此问题的方法)
sql
可能会有所帮助,只要我学会如何正确使用它。我做了以下测试:
library(multicore) # make svy fast!
ri.ny <- subset(ipums, statefips_num %in% c(36, 44))
ri.ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri.ny)
svyby(~incwage, ~strata, ri.ny.design, svymean, data=ri.ny, na.rm=TRUE, multicore=TRUE)
ri <- subset(ri.ny, statefips_num==44)
ri.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri)
ri.mean <- svymean(~incwage, ri.design, data=ri, na.rm=TRUE)
ny <- subset(ri.ny, statefips_num==36)
ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ny)
ny.mean <- svymean(~incwage, ny.design, data=ny, na.rm=TRUE, multicore=TRUE)
library(多核)#让svy快点!
ri.ny由于这个问题是不久前提出的,我想指出,我在这里的回答使用了调查
软件包的3.3版
如果您检查svydesign,
的代码,您可以看到导致所有问题的函数都在检查步骤中,检查是否应将nest
参数设置为TRUE。设置选项check.strata=FALSE
可以禁用此步骤
当然,除非您知道自己在做什么,否则不应该禁用检查步骤。在这种情况下,您应该能够自行决定是否需要将nest
选项设置为TRUE
或FALSE
,nest
在不同层中回收相同的PSU(群集)id时应设置为TRUE
具体而言,对于IPUMS数据集,由于您使用serial
变量进行聚类识别,并且serial
对于给定样本中的每个家庭都是唯一的,因此您可能需要将nest
设置为FALSE
因此,您的勘测设计线应为:
ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt, check.strata=FALSE, nest=FALSE)
在出现错误后使用traceback()
,并找出svydesign试图将如此大的表制成表格的原因——可能是您指定了错误的公式,或者数据表示不正确(例如,一个长的“id”字符串为数值
而不是系数
).Ah,我的id和strata变量实际上是整数而不是因子。我会尝试一下,让你知道。还添加了上面的traceback()
。我已经将serial
(传递到id
)和strata
(以同名方式传递)转换为整数的因子,并得到相同的错误(但这似乎会更快地引发错误)。看起来它们最初实际上是浮点数,我需要将它们转换为整数。我仍然不能对整个数据集进行计算,但我可以对子集进行计算。将其作为一个因子,无论子集的长度如何,都会产生相同的错误。我不一定要生成一个2^40大小的向量,我只是在ho中选择了比2^31大得多的数字我想我可以绕过这个问题。我不确定向量实际上有多大,我会尝试找出答案。我想处理完整数据集的原因是我担心调查
包如何工作,以及数据子集会在多大程度上扭曲我的结果。我不知道以概率创建的对象的细节加权,以及是否创建这样一个对象最初需要整个数据集,然后我可以向下子集。如果我不能正确创建设计对象,那么我根本不能使用R
来进行此操作。@Griffith点是nbins
向量大于2^31-1,因此尝试计算re是没有意义的R无法处理的代码。@Griffith我认为这一切都是颠倒过来的。如果你不知道某些东西是如何工作的,你可以使用一个小的、经过充分研究的数据集,你可以在其他软件或教科书工作的示例中检查结果。例如,你可以从整个数据集中抽取一个样本,进行分析,然后使用一个较小的采样器进行分析您刚刚采集的样本并重新进行分析,比较结果。这将允许您在不分析整个数据集的情况下继续操作,并帮助您确定是否需要所有数据。非常感谢。按照您的建议进行了操作,而且看起来syvdesign
甚至可以
svy: mean age, over(strata)
library(multicore) # make svy fast!
ri.ny <- subset(ipums, statefips_num %in% c(36, 44))
ri.ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri.ny)
svyby(~incwage, ~strata, ri.ny.design, svymean, data=ri.ny, na.rm=TRUE, multicore=TRUE)
ri <- subset(ri.ny, statefips_num==44)
ri.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri)
ri.mean <- svymean(~incwage, ri.design, data=ri, na.rm=TRUE)
ny <- subset(ri.ny, statefips_num==36)
ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ny)
ny.mean <- svymean(~incwage, ny.design, data=ny, na.rm=TRUE, multicore=TRUE)
ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt, check.strata=FALSE, nest=FALSE)
ipums$strata <- match(ipums$strata,unique(ipums$strata))