I am using synthetic data with a model that has a lagged dependent variable. When estimating a random effects model using Swamy–Arora estimator (default) with package plm, I get the error
Error in swar(object, data, effect) :
the estimated variance of the individual effect is negative
But, if I try with any other of the available estimators (namely, "walhus", "amemiya", "nerlove" or "kinla"), then everything works fine.
Below is a code that shows the issue.
###########################################################
# Script to show problem with swar estimator of r.e. in plm
# Date: 20151013
###########################################################
# Dependencies
library(MASS) # to sample correlated multinormal
library(plm)
#########################################################################
# CREATE TEST DATA
# This part creates a panel with H individuals and S observations each
# The model has a lagged dependent variable with weight rho
# We also use k multinormal correlated (r) predictors, with weights = 1:k
# We use random effects u = 1:H
# Series start at y0
#########################################################################
k = 5
r = 0.5
S = 1000
R = mat.or.vec(k, k) + r
diag(R) = 1
y0 = 1
rho = 0.9
sigma_e = 3
H = 10
for(h in 1:H){
# Predictors
X = mvrnorm(S, rep(0, k), R)
# Dependent
y = mat.or.vec(S, 1)
y[1] = y0
eps = rnorm(S, 0, sigma_e)
for(i in 2:S){
y[i] = rho * y[i-1] + as.numeric(X[i,] %*% 1:k) + eps[i] + h
}
# we create a lagged depedendent variable manually to see if this fixes
# the problem
temp = data.frame(y[2:S], y[1:(S-1)], X[2:S, ], rep(h, S-1))
names(temp) = c("y", "y.l", paste("x", 1:5, sep=""), "id")
temp$t = 1:(S-1)
if (h == 1) {
datos = temp
} else {
datos = rbind(datos, temp)
}
}
# Finished
######################################################################
# ESTIMATE THE PANEL
# First we estimate F.E.: it work perfectly
# Then we estimate R.E.
######################################################################
pdatos = pdata.frame(datos, index = c("id", "t"))
# Fixed effects
fitfe = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5, data = pdatos)
summary(fitfe) # Beta OK
sqrt(sum(fitfe$residuals ^ 2) / fitfe$df.residual) # sigma_e OK
summary(fixef(fitfe)) # F.E. OK
# Random effects: swar
fitre = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "swar") # Fails
# manually created lag
fitre = plm(y ~ y.l + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "swar") # Fails
# Random effects: other methods
fitre = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "walhus") # OK
summary(fitre)
fitre = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "amemiya") # OK
summary(fitre)
fitre = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "nerlove") # OK
summary(fitre)
fitre = plm(y ~ lag(y, 1) + x1 + x2 + x3 + x4 + x5,
data = pdatos, model = "random", random.method = "kinla") # OK
summary(fitre)
# End
Best Answer
The error message is correct; this is not an error with the
plm
package in particular. The default Swamy and Arora (1972) estimator (random.method="swar"
is used if not something else is explicitly stated by the user) is not guaranteed to yield positive estimates for the variance.Sometimes, just adding more control variables or transforming variables also help to overcome this issue (from a technical viewpoint) if you want to stick with the swar estimator.