Вот пример, который показывает, что функция 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)