почему make.pbalanced из plm так медленно работает с наборами данных среднего размера? - PullRequest
0 голосов
/ 15 апреля 2020

Вот пример, который показывает, что функция make.pbalanced из plm намного медленнее, чем ручное решение с использованием пары строк dplyr.

. Я создаю набор данных панели на 20 000 единиц за 20 лет и случайным образом сбрасывают 10% строк. Затем я перебалансировал его двумя способами: сначала с помощью make.pbalanced, а затем с помощью «ручного» решения с использованием crossing, unique и left_join.

Решение plm занимает 1,2 м, в то время как ручное решение занимает 1,4 с.

Мне любопытно, почему make.pbalanced такой медленный. Если я наберу sh количество человек до 50 000, то у меня вылетит компьютер. Это довольно маленькие размеры для типичных панельных наборов данных (например, продольные обследования домашних хозяйств).

Вот код:

library(tidyr)
library(dplyr)
library(plm)

#create a full unbalanced panel data set
id = (1:20000)
year = (1980:2000)
full_panel = crossing(id, year) 
full_panel$x = rnorm(nrow(full_panel))

#take 90% sample to unbalance it
panel_missing = sample_n(full_panel, round(nrow(full_panel)*0.9), replace = FALSE)

#balance panel using make.pbalanced
start_time = Sys.time()
panel_balanced = pdata.frame(panel_missing, index = c("id", "year")) %>% 
  make.pbalanced()
end_time = Sys.time()
print(end_time - start_time)

#balance panel manually
start_time = Sys.time()
id = unique(panel_missing$id)
year = unique(panel_missing$year)
panel_balanced = crossing(id, year) %>% 
  left_join(panel_missing)
end_time = Sys.time()
print(end_time - start_time)
...