Skip to content
Prev 305421 / 398506 Next

Constraining parameters using tag() in SUR model - ZELIG

On 13 September 2012 18:38, Samantha Azzarello
<samantha.azzarello at cmegroup.com> wrote:
:-)
A simple example with three equation and two parameters in each equation:
   eq1: y1 = a0 + a1 * x1
   eq2: y2 = b0 + b1 * x1
   eq3: y3 = c0 + c1 * x1
with restrictions
   a0 = b0 = c0
and
   a1 = b1 = c1

In fact, you have 4 restrictions (number of equality signs):
   a0 = b0
   b0 = c0
   a1 = b1
   b1 = c1

Given that you have 4 restrictions and 6 parameters, argument
restriction.matrix should be:

m <- matrix( 0, nrow = 4, ncol = 6 )
# a0 - b0 = 0
m[ 1, 1 ] <- 1
m[ 1, 3 ] <- -1
# b0 - c0 = 0
m[ 2, 3 ] <- 1
m[ 2, 5 ] <- -1
# a1 - b1 = 0
m[ 3, 2 ] <- 1
m[ 3, 4 ] <- -1
# b1 - c1 = 0
m[ 4, 4 ] <- 1
m[ 4, 6 ] <- -1


Of course, the above restrictions are identical to:
   a0 = b0
   a0 = c0
   a1 = b1
   a1 = c1

m <- matrix( 0, nrow = 4, ncol = 6 )
# a0 - b0 = 0
m[ 1, 1 ] <- 1
m[ 1, 3 ] <- -1
# a0 - c0 = 0
m[ 2, 1 ] <- 1
m[ 2, 5 ] <- -1
# a1 - b1 = 0
m[ 3, 2 ] <- 1
m[ 3, 4 ] <- -1
# a1 - c1 = 0
m[ 4, 2 ] <- 1
m[ 4, 6 ] <- -1

Alternatively, you can specify the restrictions symbolically using
argument restrict.matrix:
m <- c( "eq1_(Intercept) - eq2_(Intercept) = 0",
   "eq2_(Intercept) - eq3_(Intercept) = 0",
   "eq1_x1 - eq2_x1 = 0", "eq2_x1 - eq3_x2 = 0" )

Finally, you might use argument restrict.regMat. As you have 6
unconstrained parameters (a0,a1,b0,b1,c0,c1) and two constrained
parameters (r0,r1), argument restrict.regMat should be:
m <- matrix( 0, nrow = 6, ncol = 2 )
m[1,1] <- 1  # r0 = a0
m[3,1] <- 1  # r0 = b0
m[5,1] <- 1  # r0 = c0
m[2,2] <- 1  # r1 = a1
m[4,2] <- 1  # r1 = b1
m[6,2] <- 1  # r1 = c1

All approaches are mathematically equivalent but the latter approach
(using argument restrict.regMat) is computationally/numerically
preferable.

ATTENTION: all of the code above is untested!
OK.

/Arne