We demonstrate how to use the OrthoPanels package with an analysis of a subset of data from the 2010 British Election Study. The data consists of 3 waves of panel survey data with 1845 respondents. Our dependent variable is government approval (“Approve”), while independent variables in the model are evaluations of each party’s leader (“Brown”, “Cameron”, and “Clegg” for Labour, Conservative, and Liberal Party respectively) and government health and security policies (“NHS” and “Terror”); assesment of the economic situation (“Econ”); preference for taxing and spending policy (“Tax”); and personal identification with the governing Labour Party (“PID”).
This subset of BES 2010 data is included with the OrthoPanels package
as dataset BES_panel
. It is a data frame that includes all
of the survey variables as described above, plus the variables for the
case number (“n”) and the wave (“t”) of each observation:
## n t Econ Clegg Brown Cameron Approve NHS Terror PID Tax
## 1 1 1 3 0 9 0 7 0 0 1 6
## 2 2 1 4 0 10 0 8 0 0 1 8
## 3 3 1 3 0 5 4 7 0 0 0 6
## 4 4 1 2 0 7 3 4 0 0 1 6
## 5 5 1 2 0 0 0 0 0 0 0 5
## 6 6 1 2 0 7 0 8 0 0 1 4
We begin by specifying our model using a formula, indicating the data to be used, and the case and time variables:
BES.opm <- opm(Approve~Econ+Clegg+Brown+Cameron-NHS+Terror+PID-Tax,
data=BES_panel, index = c('n', 't'), n.samp=1000, add.time.indicators=TRUE)
The first argument is a formula specifying the model symbolically:
response ~ term1 + term2
. This is consistent with the
lm()
function. It is not necessary to include the lagged
dependent variable or the fixed effects in the model specification. This
is done automatically.
The other arguments are: data
which specifies the data
frame, list or environment containing the variables in the model;
n.samp
which specifies the number of samples (MC
iterations) to use to estimate the parameters; index
which
is a two-element vector containing the index or name of the case and
time variables, respectively; and add.time.indicators
which
is a logical argument. If add.time.indicators
is
TRUE
, the model includes dummy variables for each wave
(time point). The default is FALSE
. The data
and index
arguments are optional; if data
is
missing, variables are looked up in the environment, while the default
value of index
is the first two variables in the data
frame. An additional optional argument is subset
. This is a
vector specifying a subset of observations to be used in the
estimation.
The function opm()
returns an object of class
opm
which includes a list,samples
, with the
following elements: rho
, a vector of n
.samp
parameter samples of ρ;
sig2
, a vector of n.samp parameter samples of σ2; and
beta
, an n.samp x variable
matrix of
parameters samples of β. If
included in the model, the parameters for the time dummies are included
in this matrix:
## List of 11
## $ samples :List of 3
## ..$ rho : num [1:1000] 0.192 0.267 0.139 0.157 0.209 0.17 0.194 0.232 0.161 0.234 ...
## ..$ sig2: num [1:1000] 1.73 1.93 1.85 1.78 1.86 ...
## ..$ beta: num [1:1000, 1:7] 0.0349 0.066 0.0921 0.0459 0.0269 ...
## .. ..- attr(*, "dimnames")=List of 2
## .. .. ..$ : NULL
## .. .. ..$ : chr [1:7] "Econ" "Clegg" "Brown" "Cameron" ...
## $ fitted.values : num [1:2, 1:1845] -0.574 0.574 -0.326 0.326 0.311 ...
## $ residuals : num [1:2, 1:1845] -0.426 0.426 0.826 -0.826 0.189 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ t: chr [1:2] "2" "3"
## .. ..$ i: chr [1:1845] "1" "2" "3" "4" ...
## $ df.residual : num 3682
## $ logLik : num -1811
## $ design : chr "balanced"
## $ call : language opm(x = Approve ~ Econ + Clegg + Brown + Cameron - NHS + Terror + PID - Tax, data = BES_panel, index = c("n"| __truncated__
## $ .Environment :<environment: R_GlobalEnv>
## $ time.indicators: logi TRUE
## $ index : chr [1:2] "n" "t"
## $ terms :Classes 'terms', 'formula' language Approve ~ Econ + Clegg + Brown + Cameron - NHS + Terror + PID - Tax
## .. ..- attr(*, "variables")= language list(Approve, Econ, Clegg, Brown, Cameron, NHS, Terror, PID, Tax)
## .. ..- attr(*, "factors")= int [1:9, 1:6] 0 1 0 0 0 0 0 0 0 0 ...
## .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. ..$ : chr [1:9] "Approve" "Econ" "Clegg" "Brown" ...
## .. .. .. ..$ : chr [1:6] "Econ" "Clegg" "Brown" "Cameron" ...
## .. ..- attr(*, "term.labels")= chr [1:6] "Econ" "Clegg" "Brown" "Cameron" ...
## .. ..- attr(*, "order")= int [1:6] 1 1 1 1 1 1
## .. ..- attr(*, "intercept")= int 0
## .. ..- attr(*, "response")= int 1
## .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
## .. ..- attr(*, "predvars")= language list(Approve, Econ, Clegg, Brown, Cameron, NHS, Terror, PID, Tax)
## .. ..- attr(*, "dataClasses")= Named chr [1:9] "numeric" "numeric" "numeric" "numeric" ...
## .. .. ..- attr(*, "names")= chr [1:9] "Approve" "Econ" "Clegg" "Brown" ...
## - attr(*, "class")= chr "opm"
The summary of the object provides us with the median, 68% equal tailed credible intervals and 95% equal tailed credible intervals for each parameter:
## Call:
## opm(x = Approve ~ Econ + Clegg + Brown + Cameron - NHS + Terror +
## PID - Tax, data = BES_panel, index = c("n", "t"), n.samp = 1000,
## add.time.indicators = TRUE)
##
## Parameter estimates:
## <--95CI <--68CI med 68CI--> 95CI-->
## rho 0.139000 0.1670000 0.201000 0.237000 0.2700250
## sig2 1.637933 1.7086484 1.794335 1.882069 1.9787933
## beta.Econ -0.031995 0.0031441 0.043420 0.085363 0.1275153
## beta.Clegg -0.018453 0.0019442 0.025696 0.047280 0.0682566
## beta.Brown 0.315151 0.3363567 0.361162 0.384107 0.4042607
## beta.Cameron -0.129456 -0.1090330 -0.086439 -0.061236 -0.0385069
## beta.Terror -0.158858 -0.1276249 -0.089806 -0.050744 -0.0096311
## beta.PID 0.516859 0.6707568 0.818949 0.975505 1.1414816
## beta.tind.2 0.274244 0.3413324 0.402346 0.469123 0.5265223
The package includes functions that may be of use in exploring the
results. Method confint
for objects of opm
class computes equal-tailed credible intervals for one or more
parameters in the fitted opm model. We can calculate 90% equal-tailed
credible intervals as follows:
## 5% 95%
## rho 0.14790000 0.26000000
## sig2 1.66152913 1.94566916
## beta.Econ -0.02479152 0.11017043
## beta.Clegg -0.01150765 0.06175130
## beta.Brown 0.32359063 0.39890105
## beta.Cameron -0.12361407 -0.04703893
## beta.Terror -0.14891867 -0.02065484
## beta.PID 0.56333448 1.08844790
## beta.tind.2 0.29808491 0.51012050
The function caterplot
creates side-by-side plots of
credible intervals of the opm model parameters. The intervals are
displayed as horizontal lines, with the 90% interval using a thicker
line width and the 95% interval a thinner one. The posterior median is
indicated with a dot.
We can use the function plot()
to obtain the posterior
density of each parameter:
In a dynamic model, the β coefficients are the immediate effects of a change in each of the covariates. This is known as the short run effect. However, in a dynamic model, the short run effect is not the full effect of a change in a covariate. As the future value of the dependent variable depends on the current value, the effect of a change in a covariate has a knock on effect into the future. The effect builds at a declining rate until it asymptotically reaches its full effect. This is known as the long-run effect and is estimated as $\frac{\beta}{1-\rho}$, where ρ is the autoregressive parameter (Wooldridge, 2013; Pickup, 2014). We can calculate the median and 95% equal tailed credible intervals for the long-run effects from the parameter samples. For example, for the first independent variable (the economy):
## 2.5% 50% 97.5%
## -0.03995668 0.05404385 0.15935029
The function longRunEffects
Computes long term effects
and confidence intervals of Model Parameters, using the formula as per
explanation above. By default, it computes the median and 95% equal
tailed credible intervals for the long-run effects from the parameter
samples.
## Econ Clegg Brown Cameron Terror PID
## 2.5% -0.03995668 -0.02261621 0.3833851 -0.16535263 -0.20163270 0.6505829
## 50% 0.05404385 0.03231973 0.4515145 -0.10796204 -0.11239461 1.0269751
## 97.5% 0.15935029 0.08589321 0.5368402 -0.04956313 -0.01218709 1.4564280
## tind.2
## 2.5% 0.3411181
## 50% 0.5050432
## 97.5% 0.6876106
The function caterplot_longRun
creates side-by-side
plots of credible intervals of the opm model long-run effects, which are
computed using the function The function longRunEffects
.
The intervals are displayed as horizontal lines, with the 90% interval
using a thicker line width and the 95% interval a thinner one. The
posterior median is indicated with a dot.