Code:
. ssc install moremata, replace
Handling of collinear variables by the entropy balancing function mm_ebal() was somewhat inconsistent. This is fixed.
By the way, although it seems obvious, I just realized some days ago that entropy balancing can be used to obtain weights that orthogonalize the data (while keeping means and variances at their original values; thanks goes to Xiang Zhou from Harvard University). Here's an example:
Code:
. sysuse nlsw88, clear (NLSW, 1988 extract) . drop if missing(age, hours, tenure) (19 observations deleted) . mata: : X = st_data(., "age hours tenure") : N = rows(X) : C = (X:-mean(X)) :/ sqrt(diagonal(variance(X))*(N-1)/N)' : C = C, C:^2:-1, C[,1]:*C[,2], C[,1]:*C[,3], C[,2]:*C[,3] : S = mm_ebal_init(J(1, cols(C), 0), rows(C), C, 1) : (void) mm_ebal(S) Iteration 0: max difference = .16084911 Iteration 1: max difference = .08103064 Iteration 2: max difference = .00177662 Iteration 3: max difference = 4.710e-06 Iteration 4: max difference = 2.727e-11 Iteration 5: max difference = 7.384e-18 : w = mm_ebal_W(S) : // results from original data : mean(X) 1 2 3 +-------------------------------------------+ 1 | 39.15087562 37.23978446 5.981701848 | +-------------------------------------------+ : variance(X) [symmetric] 1 2 3 +----------------------------------------------+ 1 | 9.37435121 | 2 | -.8281974752 109.8472395 | 3 | 1.231685343 9.288419209 30.35687977 | +----------------------------------------------+ : // results from reweighted data : mean(X, w) 1 2 3 +-------------------------------------------+ 1 | 39.15087562 37.23978446 5.981701848 | +-------------------------------------------+ : variance(X, w) [symmetric] 1 2 3 +-------------------------------------------+ 1 | 9.37435121 | 2 | 3.57506e-16 109.8472395 | 3 | 8.68228e-16 2.04289e-16 30.35687977 | +-------------------------------------------+ : // => means and variances still the same, covariances are zero : end
0 Response to -moremata- update: improved entropy balancing algorithm
Post a Comment