Content
* ITSP 14.4 -
program drop _all
mata: mata clear
type aggreg2.ado
/*
program aggreg, rclass
version 10.1
syntax varlist(max=1 numeric) [if] [in], per(integer) ///
[func(string) trans(string)]
marksample touse
quietly count if `touse'
if `r(N)' == 0 {
error 2000
}
* validate per versus selected sample
if `per' <= 0 | `per' >= `r(N)' {
display as error "per must be > 0 and < N of observations."
error 198
}
if mod(`r(N)',`per' != 0) {
display as error "N of observations must be a multiple of per."
error 198
}
* validate func option; default is average (code A)
local ops A S F L
local opnames average sum first last
if "`func'" == "" {
local op "A"
}
else {
local nop : list posof "`func'" in opnames
if !`nop' {
display as err "Error: func must be chosen from `opnames'"
error 198
}
local op : word `nop' of `ops'
}
* validate trans option; default is none (identity)
local trops abs exp log sqrt
local trnames mf_abs mf_exp mf_log mf_sqrt
if "`trans'" == "" {
local trop ""
local trfn "mf_iden"
}
else {
local ntr : list posof "`trans'" in trops
if !`ntr' {
display as err "Error: trans must be chosen from `trops'"
error 198
}
local trop : word `ntr' of `trops'
local trfn : word `ntr' of `trnames'
}
* validate the new varname
local newvar = "`varlist'`op'`trop'`per'"
quietly generate `newvar' = .
* pass the varname and newvarname to Mata
mata: aggreg2("`varlist'", "`newvar'", `per', "`op'", ///
&`trfn'(), "`touse'")
end
*/
type aggreg2.mata
/*
version 10.1
mata:
function mf_abs(x) return(abs(x))
function mf_exp(x) return(exp(x))
function mf_log(x) return(log(x))
function mf_sqrt(x) return(sqrt(x))
function mf_iden(x) return(x)
void aggreg(string scalar vname,
string scalar newvname,
real scalar per,
string scalar op,
pointer(real scalar function) scalar f,
string scalar touse)
{
real colvector mult
if (op == "A") {
mult = J(per, 1, 1/per)
}
else if (op == "S") {
mult = J(per, 1, 1)
}
else if (op == "F") {
mult = J(per, 1, 0)
mult[1] = 1
}
else if (op == "L") {
mult = J(per, 1, 0)
mult[per] = 1
}
st_view(v1=., ., vname, touse)
v1t = (*f)(v1)
st_view(v2=., ., newvname)
v3 = colshape(v1t', per) * mult
v2[(1::rows(v3)),] = v3
}
end
*/
do aggreg2.mata
use urates, clear
aggreg2 tenn, per(3) trans(log) // calculate quarterly averages of log(tenn)
aggreg2 tenn, per(3) func(sum) trans(sqrt) // calculate quarterly sum of sqrt(tenn)
tsmktim quarter, start(1978q1) // create quarterly calendar var
list t tenn quarter tennAlog3 tennSsqrt3 in 1/12, sep(3)
clear
sysuse auto
generate en = _n
mata:
st_view(Z1=., ., ("en", "price", "mpg", "turn"), 0)
st_view(Z2=., ., ("en", "weight", "length", "rep78"), 0)
Z1[ 6, .]
Z2[ 6, .]
end
mata: mata clear
do country.mata
type country.mata
do loadcty.mata
type loadcty.mata
do compcty.mata
type compcty.mata
do country.mata
do loadcty.mata
do compcty.mata
mata:
addr1 = loadcty("US", "United States", 301.139947, 43800,"Washington DC", 38, 53, -77, -02)
addr2 = loadcty("CA", "Canada", 33.390141, 35700, "Ottawa", 45, 24, -75, -43)
addr3 = loadcty("TR", "Turkey", 71.158647, 9100, "Ankara", 39, 55, 32, 55)
addr4 = loadcty("AR", "Argentina", 40.301927, 15200, "Buenos Aires", -34, -35, 58, 22)
addr5 = loadcty("JP", "Japan", 127.433494, 33100, "Tokyo", 35, 40, 139, 45)
end
clear
set obs 1
generate lat1 = .
generate long1 = .
generate lat2 = .
generate long2 = .
mata:
compcty(*addr1, *addr2)
compcty(*addr1, *addr3)
compcty(*addr3, *addr4)
compcty(*addr1, *addr5)
end
do compcty2.mata
type compcty2.mata
mata:
compcty2(*addr1, *addr3)
compcty2(*addr3, *addr4)
end