Factor Congurence Calculation in Stata

This is a code I had written for factor congruence analysis based on the formula that I was provided. It calculates the congruence for multiple datasets of results of factor analysis (again – not original data but results). Each db being an excel file with two sheets – factor analysis results of even numbed patients and odd numbered patients.

foreach db in db1.xls db2.xls db3.xls db4.xls { clear import excel "`db'", sheet("FA_even") firstrow case(lower) count rename itemname name save FA_even_patients, replace clear import excel "`db'", sheet("FA_odd") firstrow case(lower) rename itemname name save FA_odd_patients, replace duplicates report item clear use FA_even_patients duplicates report item drop if item ==. count merge 1:1 item using FA_odd_patients drop _merge drop if item ==. mvdecode odd_* even_*, mv(0=.) mvencode _all, mv(0.0) save "congruence_dataset`db'.dta", replace // FACTOR CONGRUENCE save "congruence_dataset2`db'.dta", replace capture log close log using "congruence_analysis`db'.smcl", replace foreach fa in 2 3 4 5 6 7 8 9 10 { // FOR EACH NUMBER OF FACTORS matrix mat`fa' = J(`fa',`fa',.) // CREATE EMPTY MATRIX forvalues nx = 1(1)`fa' { // Schedule loop to run till nx FACTOR Numbers for Even patients forvalues ny = 1(1)`fa' { // Schedule loop to run till nx FACTOR Numbers for Odd patients foreach x in `fa'fac`nx' { // Pick Factor for even patients foreach y in `fa'fac`ny' { // Pick Factor for Odd patients capture drop e`x'_x_o`y' gen e`x'_x_o`y' = even_`x' * odd_`y' // A*B capture drop o_`y'_sq gen o_`y'_sq = odd_`y' * odd_`y' // B-square capture drop e_`x'_sq gen e_`x'_sq = even_`x' * even_`x' // A-Square capture drop e`x'_x_o`y'_s egen e`x'_x_o`y'_s = total(e`x'_x_o`y') // Sigma (A*B) capture drop o_`y'_sqs egen o_`y'_sqs = total(o_`y'_sq) // Sigma (B-sq) capture drop e_`x'_sqs egen e_`x'_sqs = total(e_`x'_sq) // Sigma (A-sq) // CONGRUENCE FACTOR CALCULATION capture drop e`x'_x_o`y'_c gen e`x'_x_o`y'_c = e`x'_x_o`y'_s / (o_`y'_sqs *e_`x'_sqs)^0.5 di " Even `x' Vs. Odd `y' Congruence IS " list e`x'_x_o`y'_c in 1 sum e`x'_x_o`y'_c di r(mean) matrix mat`fa'[`nx', `ny']=r(mean) capture drop e_`x'_x_o_`y' capture drop e`x'_x_o`y' capture drop o_`y'_sq capture drop e_`x'_sq capture drop e`x'_x_o`y'_s capture drop o_`y'_sqs capture drop e_`x'_sqs } } } } mat rownames mat`fa'= even1_`fa' mat colnames mat`fa'= odd1_`fa' } preserve // SAVING MATRICES foreach fa in 2 3 4 5 6 7 8 9 10 { mat list mat`fa' clear svmat mat`fa', names(odd_`fa'_) gen even = "even_`fa'_" gen rownum = _n egen col1 = concat (even rownum) order col1 drop even drop rownum outsheet using "mat`fa'`db'.csv", comma replace export excel using "`db'results_congruence.xlsx", sheet("`fa'_factors") firstrow(variables) sheetreplace } restore save "congruence_analysis3`db'.dta", replace capture log close view "congruence_analysis`db'.smcl" }

This example show shows the following techniques, some of which may help:

  • Creating Empty Matrix
  • Replacing contents of cell of a matrix using indexation
  • Matrix rownames and column names
  • Saving matrices as data