Printing output of fitglm as table to file
18 views (last 30 days)
Show older comments
Jacqueline Scholl
on 1 Aug 2019
Commented: Elsa Fouragnan
on 6 Mar 2024
Dear all,
I have fitted my regression with fitglm, inputting a table. Therefore, the output looks like a nice table with named regressors etc.
What is the best way to save this as a file for publication? An html table would be good or I guess a figure would be ok too.
Many thanks
Jacquie
5 Comments
Accepted Answer
Adam Danz
on 1 Aug 2019
Edited: Adam Danz
on 21 Jun 2022
Update: MATLAB R2021a or later
Use the formattedDisplayText function to capture the model output as a string (see Community Highlight).
%% Create a demo model
load hospital %built-in matlab data
dsa = hospital;
modelspec = 'Smoker ~ Age*Weight*Sex - Age:Weight:Sex';
mdl = fitglm(dsa,modelspec,'Distribution','binomial');
% Convert summary to char array
txt = formattedDisplayText(mdl)
Method 1: Convert model summary to char array
%% Create a demo model
load hospital %built-in matlab data
dsa = hospital;
modelspec = 'Smoker ~ Age*Weight*Sex - Age:Weight:Sex';
mdl = fitglm(dsa,modelspec,'Distribution','binomial');
% Convert summary to char array
txt = evalc('mdl')
Method 2: Extract parts of model
This method extracts each section of text from the model and stores the text in a nx1 cell array named txt. The cell aray of text will then be written to a text file.
%% Create a demo model
load hospital %built-in matlab data
dsa = hospital;
modelspec = 'Smoker ~ Age*Weight*Sex - Age:Weight:Sex';
mdl = fitglm(dsa,modelspec,'Distribution','binomial');
%% Create text and tables
% Create rows of text that should come before the table
txt{1,1} = mdl.Formula.char;
txt{2,1} = sprintf('Distribution = %s',mdl.Distribution.Name);
% Create the table of coefficients. I also appended the confidence intervals to the end.
txt{3,1} = table2CellStrFcn([mdl.Coefficients, array2table(mdl.coefCI,'VariableNames',{'coefCIlow','coefCIhigh'})]);
% Create rows of text that should come after the table
txt{4,1} = sprintf('%d observations, %d df', mdl.NumObservations, mdl.DFE);
[pv,fstat] = coefTest(mdl);
txt{5,1} = sprintf('F-Statistic vs. constant model: %.1f, p = %0.6f', fstat, pv);
% Create additional tables if needed
struct2str = @(x)strsplit(evalc('disp(x);'),newline)';
txt{6,1} = ['________R-Squared________'; struct2str(mdl.Rsquared)];
txt{7,1} = ['_____Criterion_____'; struct2str(mdl.ModelCriterion)];
varinfoTable = mdl.VariableInfo;
varinfoTable.Class = [];
varinfoTable.Range = [];
txt{8,1} = table2CellStrFcn(varinfoTable);
%% Write text and tables to file.
% Convert any non-cell elements of txt to cell
notCellIdx = ~cellfun(@iscell, txt);
txt(notCellIdx) = cellfun(@(x){{x}},txt(notCellIdx));
% add an empty row between each element to separate the sections of text
txtSpace = repmat({{' '}}, size(txt));
txt = reshape([txt';txtSpace'],[],1);
% Vertically concatenate cell arrays
txt = vertcat(txt{:});
% Open / Create a new text file named 'GLM_results.txt'.
fid = fopen('GLM_results.txt', 'wt'); % a full path would be better
fprintf(fid,'%s\n', txt{:});
fclose(fid);
%% Function that converts table to cell of strings
function Tstr = table2CellStrFcn(T)
% Input a numeric table with column and row names (T) and convert to cell of strings (Tstr)
cname = [' ', T.Properties.VariableNames];
rname = T.Properties.RowNames;
datastr = cellfun(@num2str,table2cell(T),'UniformOutput',false);
Tstr = [cname; [rname, datastr]];
% pad elements of Tstr so columns have the same length
maxLen = max(cellfun(@numel, Tstr),[], 1);
for i = 1:size(Tstr,2)
Tstr(:,i) = pad(Tstr(:,i),maxLen(i),'right');
end
% Join columns to make nx1 array
Tstr = cellfun(@strjoin,mat2cell(Tstr,ones(1,size(Tstr,1)), size(Tstr,2)),'Unif',false);
end
(Updated on 6/21/22 to define struct2str)
Here's an screen shot of the resultant text file.
0 Comments
More Answers (2)
Vlad Pineta
on 20 Jun 2022
I've created the same file but exporting as LaTex and without the error about "struct2str"
function regressionExport(name,mdl,vargin)
txt{1,1} = '\begin{table}[]';
txt{2,1} = '\centering';
txt{3,1} = '\begin{tabular}{|ccccccc}';
txt{4,1} = '\hline';
txt{5,1} = strcat('\multicolumn{7}{|c|}{',mdl.Formula.char,'}',{' '},'\\ \hline');
txt{6,1} = strcat('\multicolumn{7}{|c|}{','Distribution =',{' '},mdl.Distribution.Name,'}',' \\ \hline');
tabel_coefficients = [mdl.Coefficients, array2table(mdl.coefCI,'VariableNames',{'coefCIlow','coefCIhigh'})];
tabel_coefficients_cname = [' ', tabel_coefficients.Properties.VariableNames];
tabel_coefficients_rname = tabel_coefficients.Properties.RowNames;
tabel_coefficients_datastr = cellfun(@num2str,table2cell(tabel_coefficients),'UniformOutput',false);
tabel_coefficients = [tabel_coefficients_cname; [tabel_coefficients_rname, tabel_coefficients_datastr]];
tabel_coefficients = string(tabel_coefficients);
txt{7,1} = strcat(tabel_coefficients{1,1},{' '},'&',{' '},tabel_coefficients{1,2},{' '},'&',{' '},tabel_coefficients{1,3},{' '},'&',{' '},tabel_coefficients{1,4},{' '},'&',{' '},tabel_coefficients{1,5},{' '},'&',{' '},tabel_coefficients{1,6},{' '},'& \multicolumn{1}{c|}{',tabel_coefficients{1,7},'} \\ \cline{2-7}');
tabel_coefficients(1,:) = [];
txt8 = {};
for i = 1:size(tabel_coefficients,1)
if i == size(tabel_coefficients,1)
x = strcat('\multicolumn{1}{|c|}{',tabel_coefficients(i,1),'} &',{' '},tabel_coefficients(i,2),{' '},'&',{' '},tabel_coefficients(i,3),{' '},'&',{' '},tabel_coefficients(i,4),{' '},'&',{' '},tabel_coefficients(i,5),{' '},'&',{' '},tabel_coefficients(i,6),{' '},'& \multicolumn{1}{c|}{',tabel_coefficients(i,7),'} \\ \hline');
txt8 = [txt8;x];
else
x = strcat('\multicolumn{1}{|c|}{',tabel_coefficients(i,1),'} &',{' '},tabel_coefficients(i,2),{' '},'&',{' '},tabel_coefficients(i,3),{' '},'&',{' '},tabel_coefficients(i,4),{' '},'&',{' '},tabel_coefficients(i,5),{' '},'&',{' '},tabel_coefficients(i,6),{' '},'& \multicolumn{1}{c|}{',tabel_coefficients(i,7),'} \\');
txt8 = [txt8;x];
end
end
txt{8,1} = txt8;
txt{9,1} = strcat('\multicolumn{7}{|c|}{',string(mdl.NumObservations),' observations ,',{' '},string(mdl.DFE),' df','} \\ \hline');
[pv,fstat] = coefTest(mdl);
txt{10,1} = strcat('\multicolumn{7}{|c|}{',sprintf('F-Statistic vs. constant model: %.1f, p = %0.6f', fstat, pv),'} \\ \hline');
txt{11,1} = strcat('\multicolumn{2}{|c|}{R-Squared} & & & & & \\ \cline{1-2}');
tabel_rsquared = struct2table(mdl.Rsquared);
cell_rsquared = table2cell(tabel_rsquared);
titles_rsquared = tabel_rsquared.Properties.VariableNames;
cell_rsquared = [titles_rsquared;cell_rsquared];
cell_rsquared = cell_rsquared';
cell_rsquared = string(cell_rsquared);
txt12 = {};
for i = 1:size(cell_rsquared,1)
if i == size(cell_rsquared,1)
x = strcat(cell_rsquared(i,1),{' '},'& \multicolumn{1}{c|}{',cell_rsquared(i,2),'} & & & & & \\ \cline{1-2}');
txt12 = [txt12;x];
else
x = strcat(cell_rsquared(i,1),{' '},'& \multicolumn{1}{c|}{',cell_rsquared(i,2),'} & & & & & \\');
txt12 = [txt12;x];
end
end
txt{12,1} = txt12;
txt{13,1} = strcat('\multicolumn{2}{|c|}{Criterion} & & & & & \\ \cline{1-2}');
tabel_modelcriterion = struct2table(mdl.ModelCriterion);
cell_modelcriterion = table2cell(tabel_modelcriterion);
titles_modelcriterion = tabel_modelcriterion.Properties.VariableNames;
cell_modelcriterion = [titles_modelcriterion;cell_modelcriterion];
cell_modelcriterion = cell_modelcriterion';
cell_modelcriterion = string(cell_modelcriterion);
txt14 = {};
for i = 1:size(cell_modelcriterion,1)
if i == size(cell_modelcriterion,1)
x = strcat(cell_modelcriterion(i,1),{' '},'& \multicolumn{1}{c|}{',cell_modelcriterion(i,2),'} & & & & & \\ \cline{1-3}');
txt14 = [txt14;x];
else
x = strcat(cell_modelcriterion(i,1),{' '},'& \multicolumn{1}{c|}{',cell_modelcriterion(i,2),'} & & & & & \\');
txt14 = [txt14;x];
end
end
txt{14,1} = txt14;
tabel_variableinfo = mdl.VariableInfo;
tabel_variableinfo.Class = [];
tabel_variableinfo.Range = [];
tabel_variableinfo_cname = [' ', tabel_variableinfo.Properties.VariableNames];
tabel_variableinfo_rname = tabel_variableinfo.Properties.RowNames;
tabel_variableinfo_datastr = cellfun(@num2str,table2cell(tabel_variableinfo),'UniformOutput',false);
tabel_variableinfo = [tabel_variableinfo_cname; [tabel_variableinfo_rname, tabel_variableinfo_datastr]];
tabel_variableinfo = string(tabel_variableinfo);
txt{15,1} = strcat(tabel_variableinfo{1,1},{' '},'&',{' '},tabel_variableinfo{1,2},{' '},'& \multicolumn{1}{c|}{',tabel_variableinfo{1,3},'} & & & \multicolumn{1}{l}{} & \\ \cline{2-3}');
tabel_variableinfo(1,:) = [];
txt16 = {};
for i = 1:size(tabel_variableinfo,1)
if i == size(tabel_variableinfo,1)
x = strcat('\multicolumn{1}{|c|}{',tabel_variableinfo(i,1),'} &',{' '},tabel_variableinfo(i,2),{' '},'& \multicolumn{1}{c|}{',tabel_variableinfo(i,3),'} & & \multicolumn{1}{l}{} & \multicolumn{1}{l}{} & \\ \cline{1-3}');
txt16 = [txt16;x];
else
x = strcat('\multicolumn{1}{|c|}{',tabel_variableinfo(i,1),'} &',{' '},tabel_variableinfo(i,2),{' '},'& \multicolumn{1}{c|}{',tabel_variableinfo(i,3),'} & & \multicolumn{1}{l}{} & \multicolumn{1}{l}{} & \\');
txt16 = [txt16;x];
end
end
txt{16,1} = txt16;
txt{17,1} = '\end{tabular}';
txt{18,1} = '\end{table}';
notCellIdx = ~cellfun(@iscell, txt);
txt(notCellIdx) = cellfun(@(x){{x}},txt(notCellIdx));
txt = vertcat(txt{:});
fid = fopen(strcat(name,'.txt'), 'wt');
fprintf(fid,'%s\n', txt{:});
fclose(fid);
end
I know it's not the best code but it works :)
3 Comments
Vlad Pineta
on 21 Jun 2022
I've modified the code to be able to print the results as pdf and i removed the inModel and isCategorical fields for the covariance coefficient. Also i rearranged the R-squared and Criterion fields for a nicer view.
function export = fitlmExport(rEdataFolder,rEname,mdl,vargin)
optionExport = 1;
if optionExport == 1
txt{1,1} = {'\documentclass[convert]{standalone}';
'\begin{document}';
'\begin{minipage}{1.6\textwidth}'};
end
txt{2,1} = '\begin{table}[!htb]';
txt{3,1} = '\centering';
txt{4,1} = '\begin{tabular}{|ccccccc|}';
txt{5,1} = '\hline';
txt{6,1} = strcat('\multicolumn{7}{|c|}{',rEname,'}',{' '},'\\ \hline');
txt{7,1} = strcat('\multicolumn{7}{|c|}{',mdl.Formula.char,'}',{' '},'\\ \hline');
tabel_coefficients = [mdl.Coefficients, array2table(mdl.coefCI,'VariableNames',{'coefCIlow','coefCIhigh'})];
tabel_coefficients_cname = [' ', tabel_coefficients.Properties.VariableNames];
tabel_coefficients_rname = tabel_coefficients.Properties.RowNames;
tabel_coefficients_datastr = cellfun(@num2str,table2cell(tabel_coefficients),'UniformOutput',false);
tabel_coefficients = [tabel_coefficients_cname; [tabel_coefficients_rname, tabel_coefficients_datastr]];
tabel_coefficients = string(tabel_coefficients);
txt{8,1} = strcat('\multicolumn{1}{|c}{}',tabel_coefficients{1,1},{' '},'&',{' '},tabel_coefficients{1,2},{' '},'&',{' '},tabel_coefficients{1,3},{' '},'&',{' '},tabel_coefficients{1,4},{' '},'&',{' '},tabel_coefficients{1,5},{' '},'&',{' '},tabel_coefficients{1,6},{' '},'&',{' '},tabel_coefficients{1,7},{' '},'\\ \cline{2-7}');
tabel_coefficients(1,:) = [];
txt9 = {};
for i = 1:size(tabel_coefficients,1)
if i == size(tabel_coefficients,1)
x = strcat('\multicolumn{1}{|c|}{',tabel_coefficients(i,1),'} &',{' '},tabel_coefficients(i,2),{' '},'&',{' '},tabel_coefficients(i,3),{' '},'&',{' '},tabel_coefficients(i,4),{' '},'&',{' '},tabel_coefficients(i,5),{' '},'&',{' '},tabel_coefficients(i,6),{' '},'&',{' '},tabel_coefficients(i,7),{' '},'\\ \hline');
txt9 = [txt9;x];
else
x = strcat('\multicolumn{1}{|c|}{',tabel_coefficients(i,1),'} &',{' '},tabel_coefficients(i,2),{' '},'&',{' '},tabel_coefficients(i,3),{' '},'&',{' '},tabel_coefficients(i,4),{' '},'&',{' '},tabel_coefficients(i,5),{' '},'&',{' '},tabel_coefficients(i,6),{' '},'&',{' '},tabel_coefficients(i,7),{' '},'\\');
txt9 = [txt9;x];
end
end
txt{9,1} = txt9;
txt{10,1} = strcat('\multicolumn{7}{|c|}{',string(mdl.NumObservations),' observations ,',{' '},string(mdl.DFE),' df','} \\ \hline');
[pv,fstat] = coefTest(mdl);
txt{11,1} = strcat('\multicolumn{7}{|c|}{',sprintf('F-Statistic vs. constant model: %.1f, p = %0.6f', fstat, pv),'} \\ \hline');
txt{12,1} = '\multicolumn{7}{l}{} \\ \cline{2-7} ';
tabel_rsquared = struct2table(mdl.Rsquared);
cell_rsquared = table2cell(tabel_rsquared);
titles_rsquared = tabel_rsquared.Properties.VariableNames;
cell_rsquared = [titles_rsquared;cell_rsquared];
cell26 = repmat({''}, 2, 6);
cell_rsquared = [cell_rsquared,cell26];
cell_rsquared = string(cell_rsquared);
txt{13,1} = strcat('\multicolumn{1}{c|}{} &',{' '},cell_rsquared(1,1),{' '},'&',{' '},cell_rsquared(1,2),{' '},'&',{' '},cell_rsquared(1,3),{' '},'&',{' '}',cell_rsquared(1,4),{' '},'&',{' '},cell_rsquared(1,5),{' '},'&',{' '},cell_rsquared(1,6),{' '},'\\ \cline{1-1}');
txt{14,1} = strcat('\multicolumn{1}{|c}{R-Squared} &',{' '},cell_rsquared(2,1),{' '},'&',{' '},cell_rsquared(2,2),{' '},'&',{' '},cell_rsquared(2,3),{' '},'&',{' '},cell_rsquared(2,4),{' '},'&',{' '},cell_rsquared(2,5),{' '},'&',{' '},cell_rsquared(2,6),{' '},'\\ \hline');
tabel_modelcriterion = struct2table(mdl.ModelCriterion);
cell_modelcriterion = table2cell(tabel_modelcriterion);
titles_modelcriterion = tabel_modelcriterion.Properties.VariableNames;
cell_modelcriterion = [titles_modelcriterion;cell_modelcriterion];
cell26 = repmat({''}, 2, 6);
cell_modelcriterion = [cell_modelcriterion,cell26];
cell_modelcriterion = string(cell_modelcriterion);
txt{15,1} = strcat('\multicolumn{1}{c|}{} &',cell_modelcriterion(1,1),{' '},'&',{' '},cell_modelcriterion(1,2),{' '},'&',{' '},cell_modelcriterion(1,3),{' '},'&',{' '},cell_modelcriterion(1,4),{' '},'&',{' '},cell_modelcriterion(1,5),{' '},'&',{' '},cell_modelcriterion(1,6),{' '},'\\ \cline{1-1}');
txt{16,1} = strcat('\multicolumn{1}{|c}{Criterion} &',{' '},cell_modelcriterion(2,1),{' '},'&',{' '},cell_modelcriterion(2,2),{' '},'&',{' '},cell_modelcriterion(2,3),{' '},'&',{' '},cell_modelcriterion(2,4),{' '},'&',{' '},cell_modelcriterion(2,5),{' '},'&',{' '},cell_modelcriterion(2,6),{' '},'\\ \hline');
txt{17,1} = '\end{tabular}';
txt{18,1} = '\end{table}';
cell_CoefficientCovariance = num2cell(mdl.CoefficientCovariance);
cell_CoefficientNames = mdl.CoefficientNames;
cell_CoefficientCovariance = [cell_CoefficientNames;cell_CoefficientCovariance];
cell_CoefficientNames = ['Coefficient Covariance',cell_CoefficientNames];
cell_CoefficientNames = cell_CoefficientNames';
cell_CoefficientCovariance = [cell_CoefficientNames,cell_CoefficientCovariance];
cell_CoefficientCovariance = string(cell_CoefficientCovariance);
txt{19,1} = '\begin{table}[]';
txt{20,1} = '\centering';
txt{21,1} = strcat('\begin{tabular}{|',repelem('c',size(cell_CoefficientCovariance,1)),'|}');
txt{22,1} = '\hline';
txt23 = {};
txt23_row = {};
for j = 1:size(cell_CoefficientCovariance,1)
for i = 1:size(cell_CoefficientCovariance,2)
if i == 1 && j == 1
temp_txt23 = strcat({' '},cell_CoefficientCovariance(j,i),{' '},'&');
elseif i == size(cell_CoefficientCovariance,2) && j == 1
temp_txt23 = strcat({' '},cell_CoefficientCovariance(j,i),{' '},'\\ \cline{2-',string(size(cell_CoefficientCovariance,2)),'}');
elseif i == 1 && j ~= 1
temp_txt23 = strcat('\multicolumn{1}{|c|}{',cell_CoefficientCovariance(j,i),'}',{' '},'&');
elseif i == size(cell_CoefficientCovariance,2) && j ~= size(cell_CoefficientCovariance,1)
temp_txt23 = strcat({' '},cell_CoefficientCovariance(j,i),{' '},'\\');
elseif i == size(cell_CoefficientCovariance,2) && j == size(cell_CoefficientCovariance,1)
temp_txt23 = strcat({' '},cell_CoefficientCovariance(j,i),{' '},'\\ \hline');
else
temp_txt23 = strcat({' '},cell_CoefficientCovariance(j,i),{' '},'&');
end
txt23_row = [txt23_row,temp_txt23];
end
txt23 = [txt23;txt23_row];
txt23_row = {};
end
txt23=cellfun(@string,txt23);
txt{23,1} = join(txt23);
txt{24,1} = '\end{tabular}';
txt{25,1} = '\end{table}';
if optionExport == 1
txt{26,1} = {'\end{minipage}';
'\end{document}'};
end
for i = 1:size(txt,1)
txt{i,1} = regexprep(txt{i,1},'([$_^])','\.');
end
notCellIdx = ~cellfun(@iscell, txt);
txt(notCellIdx) = cellfun(@(x){{x}},txt(notCellIdx));
txt = vertcat(txt{:});
export = sprintf('%s\n', txt{:});
if optionExport == 1
fid = fopen(strcat(rEdataFolder,rEname,'.txt'), 'wt');
fprintf(fid,'%s\n', txt{:});
fclose(fid);
fid = fopen(strcat(rEdataFolder,rEname,'.tex'), 'wt');
fprintf(fid,'%s\n', txt{:});
fclose(fid);
cmd = ['cd ' rEdataFolder ' && latex ' rEname '.tex && dvipdfm ' rEname ' && ' rEname '.pdf'];
system(cmd);
end
end
Adam Danz
on 21 Jun 2022
Edited: Adam Danz
on 21 Jun 2022
It's probably a lot easier to just use formattedDisplayText which was not available when my answer was originally added.
Marina Fernandez
on 21 Sep 2022
Another option is to convert the model to text, separate it by rows and convert that to a cell in order to write the results of the model in excel format:
text_model = evalc('disp(model)');
split_text_model = split(text_model,char(10));
xlswrite(excel_path,cellstr(split_text_model),'results','A1');
See Also
Categories
Find more on Data Type Identification in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!