⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _parmlist.ado

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 ADO
字号:
*! version 1.2.0  14oct2004
program define _parmlist , rclass

	version 8

	/* parses an expression that contains parameters, where parameters can
	   be {parmname} or {parmname=initializer}.  Spaces before or after
	   parmname, "=", or intializer are tolerated and removed from the
	   returned expression.

	   Returns:
	   	r(expr)      the expression with initializers removed and all
		             parameters cleaned up to be {parmname}.

		r(parmlist)  a list of the parameters with each parameter
			     listed only once.
			     
		r(initmat)   a matrix of initializers that may NOT be aligned
			     with parmlist (access be name) parmlist and 
			     which contains 0 for parameter that have not 
			     been assigned initializers. 

		r(k)	     number of parameters

	   example:

		_parmlist {a=5} * mpg / price { b=4}*{ a = 7 }*{ c }

	   returns:
		r(k)	    = 3
		r(expr)     : "{a} * mpg / price {b} * {a} * {c}"
		r(parmlist) : "a b c"
		r(inttmat)  = 7 , 4 , 0

	*/

					/* get rid of possible spaces 
					   in { parmname }	*/
	local ct 1
	while `ct' > 0 {
		local 0 : subinstr local 0 "{ " "{", all count(local ct)
	}
	local ct 1
	while `ct' > 0 {
		local 0 : subinstr local 0 " }" "}", all count(local ct)
	}
					/* Pick off parameters -- {parmname} */
	local parmlist
	tempname initmat mat1 ival
	gettoken pre rest : 0 , parse("{")
	while "`rest'" != "" {
		local pre : subinstr local pre "{" ""
		local expr `expr' `pre'

					/* find end of {parmname [=init]} */
		gettoken parminit rest : rest , parse("}")
		if substr("`rest'",1,1) != "}" {
			di as error "invalid expression equation"
			di as error "`0'"
			exit 198
		}

		local parminit : subinstr local parminit "{" ""
		local rest : subinstr local rest "}" ""

				/* Is parminit a linear combination? */
		local parminit : subinstr local parminit " :" ":", all
		local parminit : subinstr local parminit ": " ":", all
		gettoken eqname vars : parminit , parse(":")
		if "`vars'" != "" {	
			local vars : subinstr local vars ":" "", all
			tsunab vars  : `vars'
			foreach var in `vars' {
				confirm numeric variable `var'
				local varpar = substr("`eqname'_`var'", 1, 25)
				local unused : subinstr local parmlist 	/*
					*/ "`varpar'" "`varpar'", 	/*
					*/ count(local j)
				if `j' > 0 {
					local i = 0
					while `j' > 0 & `i' < 99999 {
						local nicei : di %05.0f `i'
						local unused : subinstr   /*
							*/ local parmlist /*
							*/ "`varpar'`nicei'"  /*
							*/ "`varpar'`nicei'", /*
							*/ count(local j)
						local i = `i' + 1
					}
					if `j' != 0 {
						exit 103
					}
					local varpar "`varpar'`nicei'"
				}
				matrix `mat1' = 0
				UpdateInitVals `initmat' "`varpar'" `mat1'
				local parmlist `parmlist' `varpar'
				local expr "`expr' {`varpar'} *`var'"
				if "`ferest()'" != "" {
					local expr "`expr' +"
				}
			}	
		}	
		else { 		/* Just a single parameter */
						/* evaluate or create initial
						   value */
			gettoken parm init : parminit, parse("=")
			local parm `parm'	/* sic, trimblanks */
			if "`init'" != "" {
				scalar `ival' `init'
			}
			else	scalar `ival' = .

						/* mainitain initial values
						   matrix */
			matrix `mat1' = `ival'
			UpdateInitVals `initmat' "`parm'" `mat1'

						/* maintain parmlist */

			local unused : subinstr local parmlist 		/*
					*/ "`parm'" "`parm'" , count(local ct)
			if `ct'==0 { 
				local parmlist `parmlist' `parm' 
			}
						/* put {parmname} into expr */
			local expr "`expr' {`parm'}"
		}
		gettoken pre rest : rest , parse("{")
	}
	
	local expr `expr' `pre'

					/* Return results */
	return matrix initmat 	`initmat'
	return scalar k		= `:word count `parmlist''
	return local  parmlist	`parmlist'
	return local  expr	`expr'

end


program UpdateInitVals

	version 8
	args initmat parm ivalmat 
	local col "."
	capture local col = colnumb(`initmat', "`parm'")
	if _rc | `col' == . {
		if `:word count `parm'' > 1 {
			di as error "`parm' is an invalid name"
			exit 7
		}
		confirm names `parm'
		/* If no initial value, set to zero */
		if `ivalmat'[1,1] >= . {
			mat `ivalmat'[1,1] = 0
		}
		mat colnames `ivalmat' = `parm'
		mat `initmat' = nullmat(`initmat') , `ivalmat'
	}
	else if `ivalmat'[1,1] < . {
		mat `initmat'[1, `col'] = `ivalmat'[1,1]
	}
	
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -