Почему объект R намного больше, чем те же данные в Stata/SPSS?

У меня есть данные опроса в SPSS и Stata, размер ~730 MB. Каждая из этих программ также занимает примерно столько места, которое вы ожидаете (~800MB) в памяти, если я буду работать с этими данными.

Я пытался подобрать R и попытался загрузить эти данные в R. Независимо от того, какой метод я пытаюсь (read.dta из файла Stata, fread из файла csv, read.spss из файла SPSS), объект R (измеренный с помощью object.size()) между 2.6 to 3.1 GB по размеру. Если я сохраню объект в файле R, который меньше, чем 100 MB, но при загрузке он имеет тот же размер, что и раньше.

Любые попытки анализа данных с использованием пакета опроса, особенно если я пытаюсь и subset данные, занимают значительно больше, чем эквивалентная команда в Stata.

Например, у меня есть переменная размера домашнего хозяйства 'hhpers' в моих данных 'hh', взвешенная переменной 'hhwt', подмножество 'htype'

R-код:

require(survey)
sv.design <- svydesign(ids =  ~0,data = hh, weights = hh$hhwt)
rm(hh)
system.time(svymean(~hhpers,sv.design[which
(sv.design$variables$htype=="rural"),]))

подталкивает память, используемую R до 6 ГБ, и занимает очень много времени -  пользовательская система  3.70 1.75 144.11

Эквивалентная операция в stata​​p >

svy: mean hhpers if htype == 1

завершается почти мгновенно, давая мне тот же результат.

Почему существует такое огромное различие между использованием памяти (как объектом, так и функцией) и временем между R и Stata? Я могу что-то сделать, чтобы оптимизировать данные и как R работает с ним?

ETA: Моя машина работает с 64-разрядной версией Windows 8.1, и я запускаю R без загрузки других программ. По крайней мере, среда не отличается для R, чем для Stata.

После некоторого копания, я ожидаю, что причиной этого является ограниченное количество типов данных R. Все мои данные хранятся как int, что занимает 4 байта на элемент. В данных опроса каждый ответ категорически кодируется и обычно требует хранения только одного байта, который хранит stata с использованием типа данных байта, и R-хранилища, использующие тип данных "int", что приводит к некоторой значительной неэффективности в крупных обследованиях.

Ответ 1

Относительно разницы в использовании памяти - вы на правильном пути и (в основном) из-за типов объектов. На самом деле, целая экономия займет много вашей памяти. Поэтому правильная настройка переменных типов улучшит использование памяти R. as.factor(). См. ?as.factor для получения дополнительной информации, чтобы обновить это после чтения данных. Чтобы исправить это во время чтения данных из файла, обратитесь к colClasses параметру read.table() (и аналогичным функциям, характерным для форматов stata и SPSS). Это поможет R хранить данные более эффективно (его на лету угадывание типов не является первоклассным).

Что касается второй части - скорости вычислений - синтаксический анализ больших массивов данных не является совершенным в базе R, где пакет data.table пригодится - его быстрый и очень похожий на оригинальный стиль data.frame. Сводные расчеты очень быстрые. Вы использовали бы его через hh <- as.data.table(read.table(...)), и вы можете вычислить что-то похожее на ваш пример с помощью

hh <- as.data.table(hh)
hh[htype == "rural",mean(hhpers*hhwt)]
## or
hh[,mean(hhpers*hhwt),by=hhtype] # note 'empty' first argument

Извините, я не знаком с исследованиями данных опроса, поэтому я не могу быть более конкретным.

Еще одна деталь в использовании памяти по функциям - скорее всего R сделала копию всего вашего набора данных, чтобы рассчитать краткие сводки, которые вы искали. Опять же, в этом случае data.table поможет и не позволит R делать чрезмерные копии и улучшать использование памяти.

Ответ 2

Интересным может быть также пакет memisc, который для меня привел к значительно меньшим возможным файлам, чем read.spss (однако я работал в меньшем масштабе, чем вы)

Из memisc виньетки

... Таким образом, этот пакет предоставляет средства для загрузки таких подмножеств переменных без необходимости загрузки полного набора данных. Кроме того, загрузка данных из файлов SPSS организована таким образом, что сохраняется вся информация об метках переменных, знаках значений и пользовательских отсутствующих значениях. Это стало возможным благодаря определению объектов импортера, для которых существует метод подмножества. объекты-импортеры содержат только информацию о переменных во внешнем наборе данных, но не данные. Сами данные загружаются в память, когда используются подмножество функций или as.data.set.