Hi all,
I have one of the classic problems. Saving output from a regression to a matrix. I tried to search, google etc but couldn't find a solution.
I am running several regressions. It is actually a command called
traj. A Stata plugin written i C. Downloadable from
https://www.andrew.cmu.edu/user/bjones/index.htm In short it performs longitudinal finite mixture models. I am running several models, trying to find the best combination of trajectories and polynomials. I am saving BIC, AIC, etc in a matrix. I want to save another result as well. See below.
Dataset, it is actually 28 time points and values. Showing the first 5 values for 5 patients. Each timepoint (
time_n ) measures a organ failure score (
sofa_resp_orig_n ) in 660 critically ill patients.
Code:
* Example generated by -dataex-. To install: ssc install dataex
clear
input float(sofa_resp_orig_1 sofa_resp_orig_2 sofa_resp_orig_3 sofa_resp_orig_4 sofa_resp_orig_5 time_1 time_2 time_3 time_4 time_5)
2 1 0 0 0 1 2 3 4 5
2 3 2 3 2 1 2 3 4 5
2 2 . . . 1 2 3 4 5
2 . . . . 1 2 3 4 5
2 2 1 0 0 1 2 3 4 5
end
Here is my problem.
Code:
* Example generated by -dataex-. To install: ssc install dataex
clear
// Setting polynomials and groups.
local polynom 3
local groups 6
// Creating matrix for later saving of results. This part is run once only.
// Creating matrix
local maxnum: display `polynom'^`groups' +1
display `maxnum'
local columns `groups'
matrix a = J(`maxnum',6,.)
matrix group = J(`maxnum',`columns',.)
timer clear
timer on 1
// Here I am running the code. I am running it several times with different starting points (from different combinations of polynomials.
// Saving the matrix to excel every time I have run a number of iterations.
// This is because the regression sometimes does not converge and Stata freezes. I do not want to do it all from the first combination
// if this happens.
// State polynomials, number of groups (trajectories), maximum iterations (before saving to excel), which combination of
// groups and polynomials to start from.
local polynom 3
local groups 6
local maxiter 2
local iter_start 1
// Setting variable list for traj command
local first "sofa_resp_orig_1"
local connect "-"
local second "sofa_resp_orig_28"
local maxnum: display `polynom'^`groups'
// Setting up matrix columns and naming them
matrix colnames a = "Groups" "Polynomials" "BIC(N)" "BIC(panels)" "e(AIC)" "e(ll)"
local bicn: display -10^99
local bicp: display -10^99
local aic: display -10^99
local e(BIC_N_data): display -10^99
local e(BIC_N_subjects): display -10^99
local e(AIC): display -10^99
// Filling up matrix with the possible combinations of polynomials. So I can start over at a specific combination later.
matrix b = J(`maxnum',6,.)
local i 1
forvalues a = 1/`polynom' {
forvalues b = 1/`polynom' {
forvalues c = 1/`polynom' {
forvalues d = 1/`polynom' {
forvalues e = 1/`polynom' {
forvalues f = 1/`polynom' {
matrix b[`i',1] = `a'
matrix b[`i',2] = `b'
matrix b[`i',3] = `c'
matrix b[`i',4] = `d'
matrix b[`i',5] = `e'
matrix b[`i',6] = `f'
local i `++i'
}
}
}
}
}
}
// Extracting polynomial order to traj command
forvalues a = 1/`maxiter'{
local aa = b[`iter_start',1]
local bb = b[`iter_start',2]
local cc = b[`iter_start',3]
local dd = b[`iter_start',4]
local ee = b[`iter_start',5]
local ff = b[`iter_start',6]
// Running the traj command.
quietly traj, var(`first'`connect'`second') indep(time_1-time_28) model(cnorm) min(0) max(4) order(`aa' `bb' `cc' `dd' `ee' `ff' )
// Saving output to matrix
matrix a[`iter_start',1]= e(numGroups1)
matrix a[`iter_start',2]= `aa'`bb'`cc'`dd'`ee'`ff'
matrix a[`iter_start',3]= e(BIC_N_data)
matrix a[`iter_start',4]= e(BIC_n_subjects)
matrix a[`iter_start',5]= e(AIC)
matrix a[`iter_start',6]= e(ll)
// !! here is my problem !! See below for description.
local iter_start `++iter_start'
}
timer off 1
di "`maxiter' iterations, total time"
timer list 1
// Saving matrix a (results summary) to excel in case Stata freezes.
cd "whereever/- Renal 5gr 3 poly"
putexcel set `first'`connect'`second'gr`groups'poly`polynom'_`maxiter'_`iter_start' , replace
putexcel A1 = matrix(a), names
end
In the code above, you can see where I say my probem is. The
traj command in
ereturn gives amongst other things a matrix of the percent of patients in each trajectory (
e(groupSize1)). I want to save these numbers.
e(groupSize1) is a matrix with one row and
n columns.
n is the number of trajectories estimated (6 for 6 groups/trajectories, 5 for five groups/trajectories etc).
SO I want to:
1. I want to be able to run a number of traj estimations.Starting at a given combination of trajectories and poynomials.
2. Save all results (BIC, AIC etc) to
matrix a which is done in the code above. 1-2 works fine.
3. I want to save
e(groupSize1)for each estimation and add this matrix to
matrix a. This I can not do.
I could easily save
e(groupSize1) to a matrix (
matrix groupsize = e(groupSize1)) But either matrix groupsize needs to be increased with ++i for each new estimation, and last in the code appended with matrix a.
Or, perhaps better, be added to matrix a after each run. But I then need to append matrix a with a number of columns (corresponding to the columns in e(groupSize1) every time.
Dummy code (for insertion in the code where my problem is:
matrix groupsize = e(groupSize1)
matrix a[`iter_start',7]= groupsize
This obviously does not work, I get a matrix configuration error. I get this even if I increase
matrix a to be able to contain more columns. Any suggestions how to add
e(groupSize1)to matrix a for every iteration of traj?
Hope I am making myself somewhat clear...
Best regards,
Jesper