# 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