Hi, I have an nx1
vector of positive integers frequency weights (total population), which I want to use to estimate a Weighted OLS using the formula b = inv(x'x)*x'y
but with the total population weights.
How can I estimate it using GAUSS? Thanks!
1 Answer
0
The Weighted Least Squares (WLS) coefficients can be found by
$$B_{wls} = (X'WX)^{-1}*(X'WY)$$
where
$$ W =\begin{bmatrix} w_1 & 0 & 0 & \dots & 0 \\ 0 & w_2 & 0 & \dots & 0 \\ 0 & 0 & w_3 & \dots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & 0 & \dots & w_k \end{bmatrix} $$
This weight matrix, $W$, can be formed in GAUSS using the diagrv
function. The diagrv
procedure inserts a vector into the diagonal of an existing matrix. It requires two inputs:
- x
- N x N matrix, The matrix to have the diagonal inserted into.
- v
- N x 1 vector, The vector to be inserted into the diagonal.
To compose the weight matrix for WLS, the x input should always be a square matrix of zeros with dimensions equal to the number of observations in your model.
Supposing your weights are stored in a column vector called weights
, the following code will build the appropriate weight matrix:
N = rows(weights);
w_mat = diagrv(zeros(N, N), weights);
You can then compute and print the WLS coefficients using:
// Calculate wls coefficients
b_wls = inv(x'w_mat*x)*(x'w_mat*y);
print "WLS coefficients:"; b_wls;
The code below will run an example WLS computation from start to finish using hypothetical data :
// Define data
Parent = { 0.21, 0.2, 0.19, 0.18, 0.17, 0.16, 0.15 };
Progeny = { 0.1726, 0.1707, 0.1637, 0.164, 0.1613, 0.1617, 0.1598 };
SD = {0.01988, 0.01938, 0.01896, 0.02037, 0.01654, 0.01594, 0.01763 };
// Add a constant
x = ones(rows(parent),1)~parent;
y = progeny;
// Calculate weights
weights = 1./SD.^2;
w_mat = diagrv(zeros(rows(weights),rows(weights)), weights);
// Calculate ols coefficients
b_ols = inv(x'x)*(x'y);
print "OLS coefficients:"; b_ols;
// Calculate wls coefficients
b_wls = inv(x'w_mat*x)*(x'w_mat*y);
print "WLS coefficients:"; b_wls;
Your Answer
1 Answer
The Weighted Least Squares (WLS) coefficients can be found by
$$B_{wls} = (X'WX)^{-1}*(X'WY)$$
where
$$ W =\begin{bmatrix} w_1 & 0 & 0 & \dots & 0 \\ 0 & w_2 & 0 & \dots & 0 \\ 0 & 0 & w_3 & \dots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & 0 & \dots & w_k \end{bmatrix} $$
This weight matrix, $W$, can be formed in GAUSS using the diagrv
function. The diagrv
procedure inserts a vector into the diagonal of an existing matrix. It requires two inputs:
- x
- N x N matrix, The matrix to have the diagonal inserted into.
- v
- N x 1 vector, The vector to be inserted into the diagonal.
To compose the weight matrix for WLS, the x input should always be a square matrix of zeros with dimensions equal to the number of observations in your model.
Supposing your weights are stored in a column vector called weights
, the following code will build the appropriate weight matrix:
N = rows(weights);
w_mat = diagrv(zeros(N, N), weights);
You can then compute and print the WLS coefficients using:
// Calculate wls coefficients
b_wls = inv(x'w_mat*x)*(x'w_mat*y);
print "WLS coefficients:"; b_wls;
The code below will run an example WLS computation from start to finish using hypothetical data :
// Define data
Parent = { 0.21, 0.2, 0.19, 0.18, 0.17, 0.16, 0.15 };
Progeny = { 0.1726, 0.1707, 0.1637, 0.164, 0.1613, 0.1617, 0.1598 };
SD = {0.01988, 0.01938, 0.01896, 0.02037, 0.01654, 0.01594, 0.01763 };
// Add a constant
x = ones(rows(parent),1)~parent;
y = progeny;
// Calculate weights
weights = 1./SD.^2;
w_mat = diagrv(zeros(rows(weights),rows(weights)), weights);
// Calculate ols coefficients
b_ols = inv(x'x)*(x'y);
print "OLS coefficients:"; b_ols;
// Calculate wls coefficients
b_wls = inv(x'w_mat*x)*(x'w_mat*y);
print "WLS coefficients:"; b_wls;