|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: re: matrix manipulation
<>
The following will do these three things. _underbar_ is a Mata
function being defined in the code below. Note that one of the
diagonal elements should fall under the threshold of 10, but it is
being zapped within the for loop.
---------------------
mata: mata clear
mata:
void underbar(string scalar mat,
real scalar thresh)
{
real matrix B
real scalar i
B = (st_matrix(mat) :< thresh) :/ st_matrix(mat)
for(i=1; i<=rows(B); i++) {
B[i,i] = 0
}
st_matrix("B", B)
}
end
sysuse auto,clear
qui reg price trunk weight length turn
mat list e(V)
mata: underbar("e(V)", 10)
mat list B
------------------------
You might want to see my FNASUG or UKSUG slideshow on Stata
programming with Mata, available from my IDEAS page below, regarding
use of the colon operator (:< or :/ above) or the st_* functions.
Kit Baum, Boston College Economics and DIW Berlin
http://ideas.repec.org/e/pba1.html
An Introduction to Modern Econometrics Using Stata:
http://www.stata-press.com/books/imeus.html
On Dec 12, 2008, at 09:50 , Susan Olivia wrote:
Thanks for the tips, Kit. I would like to use this opportunity to
ask 3 follow up questions:
1) For each cell (i,j) of matrix B, I would like to replace its
value with 1/(A[ij]) instead of dummy [0 1] as in before. In other
words, matrix B[i,j] = 1/A[i,j] if A[i,j] < THRESHOLD. I seem having
problem in doing this.
2) The syntax you suggested "underbar", I seem couldn't find this
entry in the STATA manual. Can you please explain what is this
doing? Perhaps once I know what "underbar" is really doing, I can
tackle #1.
3) Also, when the threshold condition met, the diagonal element of
matrix B is replaced to 1 or 1/aij. Ideally, I want the diagonal
element to be zero. Is there an efficient way to do this? What I
currently do is transform the matrix into variables and use the loop
to change the diagonal element and then transform the variables into
the matrix. I.e.
svmat B
local i=1
while `i'<=_N {
qui recode B`i' 1=0 in `i'
local i=`i'+1
}
mkmat B*, matrix(B)
Thanks in advance for any programming tips.
Cheers,
Susan
On Thu, Dec 11, 2008 at 8:00 AM, Kit Baum <[email protected]> wrote:
<>
Susan said
I would like to create a binary matrix (say matrix B) using
the existing information from current matrix A.
Specifically, for each cell (i,j) of matrix B, I want to
replace its value with 1 if the value of the corresponding
cell (i,j) of matrix A is less than the specified threshold
value. In other words, matrix B[i,j] = 1 if A[i,j] <
THRESHOLD.
No subscripting required:
--------------------------------
mata: mata clear
mata:
void underbar(string scalar mat,
real scalar thresh)
{
st_matrix("B", (st_matrix(mat) :< thresh))
}
end
sysuse auto,clear
qui reg price trunk weight length turn
mat list e(V)
mata: underbar("e(V)",0.0001)
mat list B
-----------------------------------
You could pass the name of the result matrix to Mata as well if you
wanted this to be a bit more general.
Kit Baum, Boston College Economics and DIW Berlin
http://ideas.repec.org/e/pba1.html
An Introduction to Modern Econometrics Using Stata:
http://www.stata-press.com/books/imeus.html
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/