A significant speed up can be gained by using fast (panel) data transformation
functions from package collapse
.
An additional significant speed up for the two-way fixed effects case can be
achieved if package fixest
or lfe
is installed (package collapse
needs to be installed for the fast mode in any case).
By default, this speed up is not enabled.
Option plm.fast
can be used to enable/disable the speed up. The option is
evaluated prior to execution of supported transformations (see below), so
option("plm.fast" = TRUE)
enables the speed up while
option("plm.fast" = FALSE)
disables the speed up.
To have it always switched on, put options("plm.fast" = TRUE)
in your
.Rprofile file.
See Examples for how to use the option and for a benchmarking example.
By default, package plm
uses base R implementations and R-based code. The
package collapse
provides fast data transformation functions written
in C/C++, among them some especially suitable for panel data.
Having package collapse
installed is a requirement for the speed up.
However, this package is currently not a hard dependency for package plm
but a 'Suggests' dependency.
Availability of packages fixest
and lfe
is checked for once when
package plm is attached and the additional speed up for the two-way fixed
effect case is enabled automatically (fixest
wins over lfe
),
given one of the packages is detected and options("plm.fast" = TRUE)
is set.
If so, the packages' fast algorithms to partial out fixed effects are
used (fixest::demean
(via collapse::fhdwithin
), lfe::demeanlist
).
Both packages are 'Suggests' dependencies.
Currently, these functions benefit from the speed-up (more functions are under investigation):
between,
Between,
Sum,
Within,
pseriesfy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | ## Not run:
### A benchmark of plm without and with speed-up
library("plm")
library("collapse")
library("microbenchmark")
rm(list = ls())
data("wlddev", package = "collapse")
form <- LIFEEX ~ PCGDP + GINI
# produce big data set (taken from collapse's vignette)
wlddevsmall <- get_vars(wlddev, c("iso3c","year","OECD","PCGDP","LIFEEX","GINI","ODA"))
wlddevsmall$iso3c <- as.character(wlddevsmall$iso3c)
data <- replicate(100, wlddevsmall, simplify = FALSE)
rm(wlddevsmall)
uniquify <- function(x, i) {
x$iso3c <- paste0(x$iso3c, i)
x
}
data <- unlist2d(Map(uniquify, data, as.list(1:100)), idcols = FALSE)
data <- pdata.frame(data, index = c("iso3c", "year"))
pdim(data) # Balanced Panel: n = 21600, T = 59, N = 1274400 // but many NAs
# data <- na.omit(data)
# pdim(data) # Unbalanced Panel: n = 13300, T = 1-31, N = 93900
times <- 1 # no. of repetitions for benchmark - this takes quite long!
onewayFE <- microbenchmark(
{options("plm.fast" = FALSE); plm(form, data = data, model = "within")},
{options("plm.fast" = TRUE); plm(form, data = data, model = "within")},
times = times, unit = "relative")
summary(onewayFE)
## two-ways FE benchmark requires pkg fixest and lfe
## (End-users shall only set option plm.fast. Option plm.fast.pkg.FE.tw shall
## _not_ be set by the end-user, it is determined automatically when pkg plm
## is attached; however, it needs to be set explicitly in this example for the
## benchmark.)
if(requireNamespace("fixest", quietly = TRUE) &&
requireNamespace("lfe", quietly = TRUE)) {
twowayFE <- microbenchmark(
{options("plm.fast" = FALSE);
plm(form, data = data, model = "within", effect = "twoways")},
{options("plm.fast" = TRUE, "plm.fast.pkg.FE.tw" = "collapse");
plm(form, data = data, model = "within", effect = "twoways")},
{options("plm.fast" = TRUE, "plm.fast.pkg.FE.tw" = "fixest");
plm(form, data = data, model = "within", effect = "twoways")},
{options("plm.fast" = TRUE, "plm.fast.pkg.FE.tw" = "lfe");
plm(form, data = data, model = "within", effect = "twoways")},
times = times, unit = "relative")
summary(twowayFE)
}
onewayRE <- microbenchmark(
{options("plm.fast" = FALSE); plm(form, data = data, model = "random")},
{options("plm.fast" = TRUE); plm(form, data = data, model = "random")},
times = times, unit = "relative")
summary(onewayRE)
twowayRE <- microbenchmark(
{options("plm.fast" = FALSE); plm(form, data = data, model = "random", effect = "twoways")},
{options("plm.fast" = TRUE); plm(form, data = data, model = "random", effect = "twoways")},
times = times, unit = "relative")
summary(twowayRE)
## End(Not run)
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.