📄 drawnorm.ado
字号:
*! version 7.1.1 13dec2003
program define drawnorm
version 8.2
gettoken first 0: 0, parse(",")
#del;
syntax [,
n(string)
SEED(string)
Double
CORR(string)
COV(string)
CStorage(string)
Means(string)
SDs(string)
CLEAR
] ;
#del cr
quietly count
local curn = r(N)
if `"`n'"' != "" {
confirm integer n `n'
if `n' == `curn' {
local n
}
}
if `"`n'"' == "" { /* add newvarlist to existing dataset */
local nobs = r(N)
if `nobs' <= 0 {
error 2000
}
if "`clear'" != "" {
drop _all
qui set obs `nobs'
local n `nobs'
}
}
else { /* generate new dataset */
if `n' <= 0 {
error 2000
}
qui count
if `n' != r(N) {
qui des, short
if r(changed) & ("`clear'" == "" ) {
error 4
}
drop _all
}
local nobs = `n'
qui set obs `nobs'
}
local 0 "`first'"
syntax newvarlist
local k : word count `varlist'
if "`seed'" != "" {
set seed `seed'
}
tempname P
mat `P' = I(`k')
/* C = corr */
if `"`corr'"' != "" {
tempname C
_m2matrix `C' corr `k' "`corr'" "`cstorage'"
mat `P' = `C'
mat `P' = cholesky(`P')
}
/* V = cov */
if "`cov'" != "" {
if "`corr'" != "" {
dis as err "cov() and corr() may not be specified together"
exit 198
}
tempname V S
_m2matrix `V' cov `k' "`cov'" "`cstorage'"
mat `S' = vecdiag(cholesky(`V'))
mat `P' = `V'
mat `P' = cholesky(`P')
}
/* M = means */
tempname M
if "`means'" != "" {
_m2matrix `M' means `k' "`means'"
}
else {
mat `M' = J(1,`k', 0)
}
/* S = stds */
tempname S
if `"`sds'"' != "" {
if `"`cov'"' != "" {
dis as err "cov() and sds() may not be specified together"
exit 198
}
_m2matrix `S' sds `k' "`sds'"
}
else {
mat `S' = J(1,`k',1)
}
/* generate new variables */
tokenize `varlist'
local newlist `varlist'
foreach var of local newlist {
qui gen `double' `var' = invnorm(uniform())
}
/* transform to desired corr */
mat roweq `P' = " "
mat coleq `P' = " " /* remove possible equation names from P */
mat rownames `P' = `varlist'
mat colnames `P' = `varlist'
forvalues i = 1 / `k' {
tempname new`i' row
mat `row' = `P'[`i', 1...]
mat score `new`i'' = `row'
}
tokenize `varlist'
forvalues i = 1 / `k' {
qui replace ``i'' = `new`i''
}
/* transform to desired means and std */
if "`cov'" != "" | "`sds'" != "" {
forvalues i = 1 / `k' {
qui replace ``i'' = ``i'' * `S'[1,`i']
}
}
if "`means'" != "" {
tokenize `varlist'
forvalues i = 1 / `k' {
qui replace ``i'' = ``i'' + `M'[1,`i']
}
}
if "`n'" != "" {
dis as txt "(obs `nobs')"
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -