rs_matrix {rsmatrix} | R Documentation |
Shiller's repeat-sales matrices
Description
Create a function to compute the Z
, X
, y
, and Y
matrices in Shiller (1991, sections I-II) from sales-pair data in order to
calculate a repeat-sales price index.
Usage
rs_matrix(t2, t1, p2, p1, f = NULL, sparse = FALSE)
Arguments
t2 , t1 |
A pair of vectors giving the time period of the second and
first sale, respectively. Usually a vector of dates, but other values are
possible if they can be coerced to character vectors and sorted in
chronological order (i.e., with |
p2 , p1 |
A pair of numeric vectors giving the price of the second and first sale, respectively. |
f |
An optional factor the same length as |
sparse |
Should sparse matrices from the Matrix package be used (faster for large datasets), or regular dense matrices (the default)? |
Details
The function returned by rs_matrix()
computes a generalization of the
matrices in Shiller (1991, sections I-II) that are applicable to grouped
data. These are useful for calculating separate indexes for many, say,
cities without needing an explicit loop.
The Z
, X
, and Y
matrices are not well defined if either
t1
or t2
have missing values, and an error is thrown in this
case. Similarly, it should always be the case that t2 > t1
, otherwise
a warning is given.
Value
A function that takes a single argument naming the desired matrix.
It returns one of two matrices (Z
and X
) or two vectors
(y
and Y
), either regular matrices if sparse = FALSE
, or sparse
matrices of class dgCMatrix
if sparse = TRUE
.
References
Bailey, M. J., Muth, R. F., and Nourse, H. O. (1963). A regression method for real estate price index construction. Journal of the American Statistical Association, 53(304):933-942.
Shiller, R. J. (1991). Arithmetic repeat sales price estimators. Journal of Housing Economics, 1(1):110-126.
See Also
rs_pairs()
for turning sales data into sales pairs.
Examples
# Make some data
x <- data.frame(
date = c(3, 2, 3, 2, 3, 3),
date_prev = c(1, 1, 2, 1, 2, 1),
price = 6:1,
price_prev = 1
)
# Calculate matrices
mat <- with(x, rs_matrix(date, date_prev, price, price_prev))
Z <- mat("Z") # Z matrix
X <- mat("X") # X matrix
y <- mat("y") # y vector
Y <- mat("Y") # Y vector
# Calculate the GRS index in Bailey, Muth, and Nourse (1963)
b <- solve(crossprod(Z), crossprod(Z, y))[, 1]
# or b <- qr.coef(qr(Z), y)
(grs <- exp(b) * 100)
# Standard errors
vcov <- rs_var(y - Z %*% b, Z)
sqrt(diag(vcov)) * grs # delta method
# Calculate the ARS index in Shiller (1991)
b <- solve(crossprod(Z, X), crossprod(Z, Y))[, 1]
# or b <- qr.coef(qr(crossprod(Z, X)), crossprod(Z, Y))
(ars <- 100 / b)
# Standard errors
vcov <- rs_var(Y - X %*% b, Z, X)
sqrt(diag(vcov)) * ars^2 / 100 # delta method
# Works with grouped data
x <- data.frame(
date = c(3, 2, 3, 2),
date_prev = c(2, 1, 2, 1),
price = 4:1,
price_prev = 1,
group = c("a", "a", "b", "b")
)
mat <- with(x, rs_matrix(date, date_prev, price, price_prev, group))
b <- solve(crossprod(mat("Z"), mat("X")), crossprod(mat("Z"), mat("Y")))[, 1]
100 / b