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

📄 ksmirnov.ado

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 ADO
字号:
*! version 3.1.6  22sep2004
program define ksmirnov, rclass sortpreserve
	version 6, missing
	syntax varname [=/exp] [if] [in] [, /*
		*/ BY(varname) Onesamp Exact ] 	/* onesamp ignored */
	marksample touse
	markout `touse' `by', strok

	if `"`exp'"' != "" { 
		tempvar eval
		qui gen double `eval' = `exp' if `touse' 
		local o_exp `"`exp'"'
		local exp `eval'
	}


	if "`by'"!="" {
		if `"`exp'"'!="" { error 198 }
		qui tab `by' if `touse'
		if r(r) != 2 {
			di in red "`by' takes on " r(r) " values, not 2"
			exit 450
		}
		tempvar M V1 V2
		sort `touse' `by'
		qui by `touse' `by': gen byte `M' = cond(_n==1,1,.) if `touse'
		sort `M' `by'
		qui gen `V1' = `varlist' if `by'==`by'[1] & `touse'
		qui gen `V2' = `varlist' if `by'==`by'[2] & `touse'
		local vn `V1'
		local exp `V2'

		local typ : type `by'
		if substr("`typ'",1,3)=="str" { 
			local name1 = substr(`by'[1],1,16)
			local name2 = substr(`by'[2],1,16)
		}
		else {
			local junk = `by'[1]
			local name1 : label (`by') `junk' 16
			local junk = `by'[2]
			local name2 : label (`by') `junk' 16
		}
		di _n in gr "Two-sample Kolmogorov-Smirnov test " /* 
			*/ "for equality of distribution functions:" _n 
	}
	else {
		/* exp contains evaluation of expression */
		if "`exact'"!="" { error 198 } 
		capture assert (`exp')< . if `touse'
		if _rc {
			di in red "=exp evaluate to missing in " /*
			*/ "some or all observations"
			di in red "=exp should evaluate to cumulative " /*
			*/ "density evaluated at `varlist'"
			exit 450
		}
		tempvar vn 
		qui gen `vn' = `varlist' if `touse'
		local name1 = abbrev("`varlist'", 12)
		local name2 "Cumulative"
		di _n in gr "One-sample Kolmogorov-Smirnov test " /*
			*/ "against theoretical distribution" _n  /*
			*/ _col(12) "`o_exp'" _n
	}

	tempvar G1 G2 V
	quietly {
		gen `G1' = (`vn'< .) if `touse'
		replace `G1' = (`G1'==1)
		gen `V' = `exp' if `touse'
		if "`by'"!="" {
			gen `G2' = 1 if `V'< .
			replace `V' = `vn' if `V'>=.
			sort `V'
			replace `G1' = sum(`G1')
			local m = `G1'[_N]
			replace `G1' = `G1' / `m'
			replace `G2' = sum(`G2')
			local k = `G2'[_N]
			replace `G2' = `G2' / `k'
			replace `G1' = `G1' - `G2'
			by `V': replace `G1' = `G1'[_N]
		}
		else {
			sort `vn'
			replace `G1' = sum(`G1')
			local m = `G1'[_N]
			replace `G1' = `G1' / `m' - `V'
			local k = 10e6
		}
		summarize `G1'
		local Dm = r(min)
		local Dp = r(max)
		if "`by'"=="" { local Dm = `Dm' - 1/`m' }
		local D = max(-`Dm',`Dp')
		local A = `m'*`k'/(`m'+`k')
		local Pm = exp(-2*`A'*((`Dm')^2))
		local Pp = exp(-2*`A'*((`Dp')^2))
		local Z2 = `A'*((`D')^2)
		local P = exp(-2*`Z2') - exp(-8*`Z2') + exp(-18*`Z2') /*
				*/ - exp(-32*`Z2') + exp(-50*`Z2')
		local P = min(2*`P', 1)
		local Pc = `P'
		if `P'<1 {
			if ("`exact'"!="") {
				local mk = `m'+`k'
				local den = /*
				*/ lngamma(`mk'+1)-lngamma(`m'+1)-lngamma(`k'+1)
				local i 0
				replace `G1' = 1 if _n==1
				while (`i'<`mk') {
					replace `G2' = `G1'[_n-1]+`G1'[_n]
					local i = `i' + 1
					replace `G2' = 1 if _n==1 | _n==`i'+1
					replace `G2' = 0 if abs((_n-1)/`m'-(`i'-_n+1)/`k')>=`D' | _n>`i'+1
					replace `G1' = `G2'
				}
				local Pc = log(`G1'[`m'+1]) - `den'
				local Pc = 1 - exp(`Pc')
			}
			else if `P' ~= 0 {
				local Pz = invnorm(`P')+1.04/min(`m',`k') /*
					*/ +2.09/max(`m',`k')-1.35/sqrt(`A')
				local Pc = normprob(`Pz')
			}
		}
	}
	if "`exact'"=="" { local lbl "Corrected" }
	else local lbl "    Exact"
	di in gr " Smaller group       D       P-value  `lbl'"
	di in smcl in gr " {hline 46}"
	di in gr " `name1':" _col(20) in ye %8.4f `Dp' %9.3f `Pp'
	di in gr " `name2':" _col(20) in ye %8.4f `Dm' %9.3f `Pm'
	di in gr " Combined K-S:" _col(20) in ye %8.4f `D' %9.3f `P' %11.3f `Pc'
	/* double save in S_# and r() */
	ret local group1 "`name1'"
	ret local group2 "`name2'"
	ret scalar D_1 = `Dp'
	ret scalar D_2 = `Dm'
	ret scalar p_1 = `Pp'
	ret scalar p_2 = `Pm'
	ret scalar D   = `D'
	ret scalar p   = `P'
	if "`exact'"=="" { ret scalar p_cor   = `Pc' }
	else               ret scalar p_exact = `Pc' 
	global S_1 "`name1'"
	global S_2 `Dp'
	global S_3 `Pp'
	global S_4 "`name2'"
	global S_5 `Dm'
	global S_6 `Pm'
	global S_8 `D'
	global S_9 `P'
	global S_10 `Pc'
end

⌨️ 快捷键说明

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