## Tests for model.matrix[.pFormula|.plm] and pmodel.response.[pFormula|.plm|.data.frame]
# commented lines do not run in v1.5-15
# 1) model.matrix[.pFormula|.plm]
# 2) pmodel.response.[pFormula|.plm|.data.frame]
library(plm)
data("Grunfeld", package="plm")
form <- formula(inv ~ value + capital)
plm_pool <- plm(form, data=Grunfeld, model="pooling")
plm_fe <- plm(form, data=Grunfeld, model="within")
plm_re <- plm(form, data=Grunfeld, model="random")
########### 1) model.matrix[.pFormula|.plm] ###########
# pooling and within models work pdata.frame [albeit one should input a model.frame of class pdata.frame]
pGrunfeld <- pdata.frame(Grunfeld, index = c("firm", "year"))
mf <- model.frame(pGrunfeld, form)
#MM modmat_pFormula_pdf_pool <- plm:::model.matrix.pFormula(form, data=pGrunfeld, model="pooling") # works
#MM modmat_pFormula_pdf_fe <- plm:::model.matrix.pFormula(form, data=pGrunfeld, model="within") # works
modmat_pFormula_pdf_pool <- plm:::model.matrix.pdata.frame(mf, model="pooling") # works
modmat_pFormula_pdf_fe <- plm:::model.matrix.pdata.frame(mf, model="within") # works
#modmat_pFormula_re2 <- plm:::model.matrix.pFormula(form, data=pGrunfeld, model="random") # still fails in v1.5-15
# Error:
# Error in plm:::model.matrix.pFormula(form, data = pGrunfeld, model = "random") :
# dims [product 600] do not match the length of object [0]
#### some sanity checks if various interfaces yield the same result ###
modmat_plm_pool <- model.matrix(plm_pool)
modmat_plm_fe <- model.matrix(plm_fe)
modmat_plm_re <- model.matrix(plm_re)
##### interfaces: plm vs. pFormula with pdata.frame
if(!isTRUE(all.equal(modmat_plm_pool, modmat_pFormula_pdf_pool, check.attributes = FALSE))) stop("model.matrix's are not the same")
if(!isTRUE(all.equal(modmat_plm_fe, modmat_pFormula_pdf_fe, check.attributes = FALSE))) stop("model.matrix's are not the same")
#if(!isTRUE(all.equal(modmat_plm_re, modmat_pFormula_pdf_re, check.attributes = FALSE))) stop("model.matrix's are not the same")
########### 2) pmodel.response.[pFormula|.plm|.data.frame] ###########
# pooling and within models work on a pdata.frame [the plain pdata.frame is coerced to a model.frame
# internally in pmodel.response.pFormula]
#MM resp_pFormula_pool <- plm:::pmodel.response.formula(form, data = pGrunfeld, model = "pooling")
#MM resp_pFormula_fe <- plm:::pmodel.response.formula(form, data = pGrunfeld, model = "within")
resp_pFormula_pool <- plm:::pmodel.response.formula(form, data = pGrunfeld, model = "pooling")
resp_pFormula_fe <- plm:::pmodel.response.formula(form, data = pGrunfeld, model = "within")
# still fails
# resp_pFormula_re <- plm:::pmodel.response.pFormula(form, data = pGrunfeld, model = "random")
#
# Error in model.matrix.pFormula(pFormula(formula), data = data, model = model, :
# dims [product 200] do not match the length of object [0]
### pmodel.response.data.frame on data.frame/pdata.frame
## the 'data' data.frame for pmodel.response.data.frame must be a model.frame created by plm's model.frame
## it needs to be a model.frame because then it is ensured we find the response variable in the fist column
#pGrunfeld_mf <- model.frame(pFormula(form), data = pGrunfeld)
pGrunfeld_mf <- model.frame(pGrunfeld, form)
resp_pdf_mf_pool <- plm:::pmodel.response.data.frame(pGrunfeld_mf, model = "pooling") # works
resp_pdf_mf_fe <- plm:::pmodel.response.data.frame(pGrunfeld_mf, model = "within") # works
#resp_pdf_mf_re <- plm:::pmodel.response.data.frame(pGrunfeld_mf, model = "random") # error, likely due to missing arguments
## these errored pre rev. 601 due to missing 'match.arg()' to set default value:
#pmodel.response(pFormula(form), data = pGrunfeld)
pmodel.response(form, data = pGrunfeld)
pmodel.response(pGrunfeld_mf)
#### some sanity checks if various interfaces yield the same result ###
resp_plm_pool <- pmodel.response(plm_pool)
resp_plm_fe <- pmodel.response(plm_fe)
resp_plm_re <- pmodel.response(plm_re)
# compare interface pFormula with plm
if(!isTRUE(all.equal(resp_pFormula_pool, resp_plm_pool, check.attributes = FALSE))) stop("responses not equal")
if(!isTRUE(all.equal(resp_pFormula_fe, resp_plm_fe, check.attributes = FALSE))) stop("responses not equal")
#if(!isTRUE(all.equal(resp_pFormula_re, resp_plm_re, check.attributes = FALSE))) stop("responses not equal")
# compare interface data.frame with model.frame with plm
if(!isTRUE(all.equal(resp_pdf_mf_pool, resp_plm_pool, check.attributes = FALSE))) stop("responses not equal")
if(!isTRUE(all.equal(resp_pdf_mf_fe, resp_plm_fe, check.attributes = FALSE))) stop("responses not equal")
#if(!isTRUE(all.equal(resp_pdf_mf_re, resp_plm_re, check.attributes = FALSE))) stop("responses not equal")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.