1

这是一个从如何进行调查加权问题开始的传奇。现在我似乎做对了,但我遇到了一些障碍(有关导入过程和strata变量来源的详细信息,请参阅上一篇文章):

> require(foreign)
> ipums <- read.dta('/path/to/data.dta')
> require(survey)
> ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt)
Error in if (nbins > .Machine$integer.max) stop("attempt to make a table with >= 2^31 elements") : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In pd * (as.integer(cat) - 1L) : NAs produced by integer overflow
2: In pd * nl : NAs produced by integer overflow
> traceback()
9: tabulate(bin, pd)
8: as.vector(data)
7: array(tabulate(bin, pd), dims, dimnames = dn)
6: table(ids[, 1], strata[, 1])
5: inherits(x, "data.frame")
4: is.data.frame(x)
3: rowSums(table(ids[, 1], strata[, 1]) > 0)
2: svydesign.default(id = ~serial, weights = ~perwt, strata = ~strata, 
       data = ipums)
1: svydesign(id = ~serial, weights = ~perwt, strata = ~strata, data = ipums)

这个错误似乎来自tabulate函数,我希望它足够简单以规避,首先通过改变.Machine$integer.max

> .Machine$integer.max <- 2^40

当这不起作用时,整个源代码tabulate

> 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
}

两者都没有规避问题。显然这是创建这个包的原因之一ff,但让我担心的是这个问题在多大程度上是我无法避免的R这篇文章似乎表明,即使我要使用可以避免此问题的包,我一次也只能访问 2^31 个元素。我希望使用sql(sqlitepostgresql) 来解决内存问题,但恐怕我会花一些时间让它工作,只是遇到相同的基本限制。

尝试切换回Stata也不能解决问题。再次查看上一篇文章了解我的使用方式svyset,但我想运行的计算导致Stata挂起:

svy: mean age, over(strata)

我不知道是否向它投入更多内存会解决问题。我R在有 16 个演出的桌面上运行,我Stata通过 Windows 服务器使用,目前将内存分配设置为 2000MB,但理论上我可以尝试增加它。

总而言之:

  1. 这是硬限制R吗?
  2. sql能解决我的R问题吗?
  3. 如果我把它分成许多单独的文件,会修复它(很多工作......)?
  4. 会投入大量内存Stata吗?
  5. 我是否以某种方式认真地吠叫错误的树?
4

3 回答 3

2
  1. 是的,R 对向量使用 32 位索引,因此它们可以包含不超过 2^31-1 个条目,并且您正在尝试使用 2^40 创建一些东西。有人谈论引入 64 位索引,但在出现在 R 中之前还有一段路要走。向量具有规定的硬限制,就基本 R 而言就是这样。

我不熟悉您正在做什么以就 Q 的其他部分提供任何进一步建议的细节。

为什么要使用完整的数据集?可以适应 R 对您施加的限制的较小样本不是同样有用吗?您可以使用 SQL 存储所有数据并从 R 查询它以返回更合适大小的随机子集。

于 2011-04-02T15:00:03.133 回答
1

由于这个问题是前段时间提出的,所以我想指出我在这里的回答使用的是survey包的 3.3 版本。

如果您检查代码,svydesign,您可以看到导致所有问题的函数位于检查步骤中,该检查步骤查看您是否应该将nest参数设置为 TRUE。这一步可以禁用设置选项check.strata=FALSE

当然,除非您知道自己在做什么,否则不应禁用检查步骤。在这种情况下,您应该能够自行决定是否需要将nest选项设置为TRUEFALSEnest当相同的 PSU(集群)ID 在不同的层被回收时,应该设置为 TRUE。

具体而言,对于 IPUMS 数据集,由于您使用该serial变量进行聚类识别,并且serial对于给定样本中的每个家庭都是唯一的,因此您可能需要设置nestFALSE.

因此,您的调查设计线将是:

ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt, check.strata=FALSE, nest=FALSE)

额外建议:即使绕过了这个问题,您也会发现代码非常慢,除非您将地层重新映射到从 1 到 的范围length(unique(ipums$strata))

ipums$strata <- match(ipums$strata,unique(ipums$strata))
于 2016-09-12T09:27:45.917 回答
0

@Gavin 和 @Martin 都值得称赞这个答案,或者至少引导我朝着正确的方向前进。我主要是单独回答它以使其更易于阅读。

按照我问的顺序:

  1. 是的 2^31 是一个硬限制R,尽管它是什么类型似乎很重要(这有点奇怪,因为它是向量的长度,而不是内存量(我有很多)这是陈述的问题。不要strata变量id转换为factors,这只会固定它们的长度并消除子集的影响(这是解决此问题的方法)。

  2. 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)
    

    并发现手段相同,这似乎是一个合理的测试。

    所以:理论上,只要我可以使用plyror来拆分计算sql,结果应该仍然没问题。

  3. 见 2。

  4. 投入大量内存Stata肯定会有所帮助,但现在我遇到了烦人的格式问题。我似乎能够执行我想要的大部分计算(更快,也更稳定),但我不知道如何将它变成我想要的形式。可能会就此提出一个单独的问题。我认为这里的简短版本是对于大型调查数据,Stata开箱即用要好得多。

  5. 在很多方面是的。尝试用这么大的数据进行分析并不是我应该轻易接受的事情,而且我现在还远远没有弄清楚。我正确使用了该svydesign功能,但我真的不知道发生了什么。我现在有一个(非常轻微)更好的把握,很高兴知道我在如何解决问题方面总体上是正确的。@Gavin 的一般建议是尝试与外部结果进行比较的小数据是无价的,我应该在很久以前就开始这样做。非常感谢@Gavin 和@Martin。

于 2011-04-05T22:29:13.437 回答