Files
2026-10-23 15:52:32 +08:00

166 lines
6.4 KiB
Plaintext

version 15.0
clear all
set more off
set type double
set linesize 160
capture log close _all
cd "C:/Users/cattom/Documents/econometrics/Week7"
log using "week7_stata.log", text replace
display "Week 7: household consumption and disposable income"
display "Input: numeric cells C3:L17; row 17 contains reported totals."
import excel using "Eg2_1_1/Eg2_1_1.xlsx", sheet("Sheet1") cellrange(C3:L17) clear
tempname audit
postfile `audit' double income int n double detail_total reported_total difference using "source_totals_audit.dta", replace
local income = 800
foreach col in C D E F G H I J K L {
assert `col'[1] == `income'
quietly summarize `col' in 2/14
local count = r(N)
local total = r(sum)
local reported = `col'[15]
post `audit' (`income') (`count') (`total') (`reported') (`total' - `reported')
rename `col' consume`income'
local income = `income' + 300
}
postclose `audit'
preserve
use "source_totals_audit.dta", clear
list, noobs separator(0)
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "source_totals_audit.csv", datafmt replace
restore
keep in 2/14
generate int excel_row = _n + 3
reshape long consume, i(excel_row) j(income)
drop if missing(consume)
sort income excel_row
generate int household_id = _n
order household_id excel_row income consume
assert _N == 98
assert !missing(income, consume)
label variable income "每月可支配收入(元)"
label variable consume "每月消费支出(元)"
label variable excel_row "Source worksheet row"
label variable household_id "Record identifier"
save "households_clean.dta", replace
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "households_clean.csv", datafmt replace
summarize income consume
regress consume income
estimates store OLS
estimates save "consumption_ols.ster", replace
predict double fitted, xb
predict double residual, residuals
generate double residual_sq = residual^2
scalar slope_ols = _b[income]
scalar intercept_ols = _b[_cons]
scalar rsquared_ols = e(r2)
scalar rmse_ols = e(rmse)
scalar rss_ols = e(rss)
scalar N_ols = e(N)
scalar F_ols = e(F)
scalar df_ols = e(df_r)
scalar pF_ols = Ftail(e(df_m), e(df_r), e(F))
tempname coef
postfile `coef' str12 term double estimate double se double t double p double ci_low double ci_high using "regression_coefficients.dta", replace
foreach term in income _cons {
scalar tval = _b[`term'] / _se[`term']
scalar crit = invttail(e(df_r), .025)
post `coef' ("`term'") (_b[`term']) (_se[`term']) (tval) (2*ttail(e(df_r), abs(tval))) (_b[`term']-crit*_se[`term']) (_b[`term']+crit*_se[`term'])
}
postclose `coef'
preserve
use "regression_coefficients.dta", clear
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "regression_coefficients.csv", datafmt replace
restore
quietly summarize residual, meanonly
scalar residual_sum = r(sum)
generate double income_residual = income * residual
quietly summarize income_residual, meanonly
scalar income_residual_sum = r(sum)
display "Sum of residuals = " %21.12g scalar(residual_sum)
display "Sum of income * residual = " %21.12g scalar(income_residual_sum)
drop income_residual
save "households_fitted.dta", replace
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "households_fitted.csv", datafmt replace
preserve
collapse (count) n=consume (mean) mean_consume=consume (sd) sd_consume=consume (min) min_consume=consume (max) max_consume=consume, by(income)
recast double mean_consume sd_consume
generate double fitted_mean = scalar(intercept_ols) + scalar(slope_ols)*income
generate double mean_residual = mean_consume - fitted_mean
save "income_group_summary.dta", replace
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "income_group_summary.csv", datafmt replace
list, noobs separator(0)
restore
set scheme s2color
graph set window fontface "SimSun"
twoway (scatter consume income, mcolor("26 71 111") msymbol(O) msize(small)) (lfit consume income, lcolor("174 44 51") lwidth(medthin)), title("不同可支配收入水平组家庭消费支出的条件分布图", size(medium) color(navy)) xtitle("每月可支配收入(元)", size(medsmall)) ytitle("每月消费支出(元)", size(medsmall)) xlabel(1000(500)3500) ylabel(500(500)3000, angle(90) grid glcolor("225 236 238")) xscale(range(500 4000)) yscale(range(0 3600)) legend(order(1 "consume" 2 "Fitted values") rows(1) region(lcolor(black) fcolor(white))) graphregion(color("234 242 243")) plotregion(color(white)) xsize(9) ysize(6.55) name(consumption_fit, replace)
graph save "consumption_fit.gph", replace
graph export "consumption_fit.png", width(1800) replace
graph export "consumption_fit.svg", replace
graph export "consumption_fit.pdf", replace
* Heteroskedasticity-robust standard errors as a sensitivity check.
regress consume income, vce(robust)
estimates store Robust
estimates save "consumption_robust.ster", replace
tempname robustcoef
postfile `robustcoef' str12 term double estimate double se double t double p double ci_low double ci_high using "robust_coefficients.dta", replace
foreach term in income _cons {
scalar tval = _b[`term'] / _se[`term']
scalar crit = invttail(e(df_r), .025)
post `robustcoef' ("`term'") (_b[`term']) (_se[`term']) (tval) (2*ttail(e(df_r), abs(tval))) (_b[`term']-crit*_se[`term']) (_b[`term']+crit*_se[`term'])
}
postclose `robustcoef'
preserve
use "robust_coefficients.dta", clear
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "robust_coefficients.csv", datafmt replace
restore
estimates restore OLS
estat hettest
scalar bp_chi2 = r(chi2)
scalar bp_p = r(p)
preserve
clear
set obs 1
generate N = scalar(N_ols)
generate intercept = scalar(intercept_ols)
generate slope = scalar(slope_ols)
generate r_squared = scalar(rsquared_ols)
generate root_mse = scalar(rmse_ols)
generate rss = scalar(rss_ols)
generate F = scalar(F_ols)
generate df_resid = scalar(df_ols)
generate p_F = scalar(pF_ols)
generate residual_sum = scalar(residual_sum)
generate income_residual_sum = scalar(income_residual_sum)
generate bp_chi2 = scalar(bp_chi2)
generate bp_p = scalar(bp_p)
quietly ds, has(type numeric)
format `r(varlist)' %21.15g
export delimited using "model_statistics.csv", datafmt replace
restore
display "WEEK7_ANALYSIS_COMPLETED"
log close
exit, clear