Это сага, которая началась с проблемы как сделать взвешивание опроса . Теперь, когда мне кажется, что я делаю это правильно, я наткнулся на небольшую стену (подробности процесса импорта и откуда взялась переменная 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
(или sqlite
или postgresql
), чтобы обойти проблемы с памятью, но я боюсь, что потрачу некоторое время, чтобы заставить это работать, только чтобы достичь того же фундаментального предела.
Попытка вернуться к Stata
также не решает проблему. Снова смотрите предыдущий пост о том, как я использую svyset
, но вычисление, которое я хотел бы выполнить, приводит к зависанию Stata
:
svy: mean age, over(strata)
Решит ли вопрос, что потратить больше памяти, я не знаю. Я запускаю R
на своем рабочем столе, который имеет 16 гигабайт, и использую Stata
через сервер Windows, в настоящее время устанавливая выделение памяти на 2000 МБ, но я теоретически мог бы поэкспериментировать с его увеличением.
Итак, в сумме:
- Это жесткий предел в
R
?
- Решит ли
sql
мои R
проблемы?
- Если я разделю его на множество отдельных файлов, это исправит это (много работы ...)?
- Будет ли выбрасывать много памяти при
Stata
сделать это?
- Я серьезно как-то лаю не на том дереве?