diff --git a/Data/createTrueData_simulated.m b/Data/createTrueData_simulated.m index 85e521a80c495097f9655339313fd0bca0a585fd..0dcc9a6b51e300188a7e335dbb4438ff8c20c93b 100644 --- a/Data/createTrueData_simulated.m +++ b/Data/createTrueData_simulated.m @@ -129,9 +129,9 @@ exp.PV.sem = exp.PV.eRand; % Data-based parameters exp.parameters.Caa.eRand = simulatedDataTrue.parameters.Caa.mean.*0.15; % 15% error exp.parameters.ELCo.eRand = simulatedDataTrue.parameters.ELCo.mean.*0.12; % 12% error -exp.parameters.Ctot.eRand = simulatedDataTrue.parameters.Ctot.mean.*0.20; % 25%, calculated from other variables -exp.parameters.Rtot.eRand = simulatedDataTrue.parameters.Rtot.mean.*0.082; % 12%, calculated from other variables -exp.parameters.Emax_LV.eRand = simulatedDataTrue.parameters.Emax_LV.mean.*0.077; % 10%, calculated from other variables +exp.parameters.Ctot.eRand = simulatedDataTrue.parameters.Ctot.mean.*0.20; % calculated from other variables +exp.parameters.Rtot.eRand = simulatedDataTrue.parameters.Rtot.mean.*0.082; % calculated from other variables +exp.parameters.Emax_LV.eRand = simulatedDataTrue.parameters.Emax_LV.mean.*0.077; % calculated from other variables exp.parameters.Caa.eSyst = 0; % no systematic errors exp.parameters.ELCo.eSyst = 0; % no systematic errors diff --git a/Data/plotMeasurementErrors.m b/Data/plotMeasurementErrors.m index dc976ad170ceb0970795cf41588465402d717570..92286b0166b943d68c88b023813698eb5404dc95 100644 --- a/Data/plotMeasurementErrors.m +++ b/Data/plotMeasurementErrors.m @@ -59,16 +59,16 @@ for n = 1:length(experimentNames) SV_PV_randonly(n) = trapz(datan.MV.time, trueData.PV.mean + e.pv.random); %add only offset errors and calculate stroke volume - SV_MV_offsetonly(n) = trapz(datan.MV.time, trueData.MV.mean + e.mv.systematic );%+ e.RR.MV - SV_AV_offsetonly(n) = trapz(datan.MV.time, trueData.AV.mean + e.av.systematic);% + e.RR.AV - SV_AA_offsetonly(n) = trapz(datan.MV.time, trueData.AA.mean + e.aa.systematic);% + e.RR.AA - SV_PV_offsetonly(n) = trapz(datan.MV.time, trueData.PV.mean + e.pv.systematic);% + e.RR.PV + SV_MV_offsetonly(n) = trapz(datan.MV.time, trueData.MV.mean + e.mv.systematic ); + SV_AV_offsetonly(n) = trapz(datan.MV.time, trueData.AV.mean + e.av.systematic); + SV_AA_offsetonly(n) = trapz(datan.MV.time, trueData.AA.mean + e.aa.systematic); + SV_PV_offsetonly(n) = trapz(datan.MV.time, trueData.PV.mean + e.pv.systematic); %add only systematic errors and calculate stroke volume - SV_MV_systonly(n) = trapz(datan.MV.time, trueData.MV.mean + e.mv.systematic + e.RR.MV);% - SV_AV_systonly(n) = trapz(datan.MV.time, trueData.AV.mean + e.av.systematic + e.RR.AV);% - SV_AA_systonly(n) = trapz(datan.MV.time, trueData.AA.mean + e.aa.systematic + e.RR.AA);% - SV_PV_systonly(n) = trapz(datan.MV.time, trueData.PV.mean + e.pv.systematic + e.RR.PV);% + SV_MV_systonly(n) = trapz(datan.MV.time, trueData.MV.mean + e.mv.systematic + e.RR.MV); + SV_AV_systonly(n) = trapz(datan.MV.time, trueData.AV.mean + e.av.systematic + e.RR.AV); + SV_AA_systonly(n) = trapz(datan.MV.time, trueData.AA.mean + e.aa.systematic + e.RR.AA); + SV_PV_systonly(n) = trapz(datan.MV.time, trueData.PV.mean + e.pv.systematic + e.RR.PV); end ctot_meanerr = mean(Ctoterr); @@ -167,7 +167,7 @@ for f = 1:2 t=title(letters(letternum),'FontSize',12); ax = gca; - ax.TitleHorizontalAlignment = 'left';%TitleFontWeight + ax.TitleHorizontalAlignment = 'left'; pos = t.Position; pos(1) = pos(1)-0.125; t.Position = pos; @@ -182,9 +182,9 @@ for f = 1:2 [resolutionError,postPrError,smoothingErrorReal,offsetError,allErrors,origFlow,randerrors] = flowerror(f,origflowcurves,origflownames,realRRerrors,rrdata,origTime,trueData); % Plot all in one RRpos = smoothingErrorReal; - RRpos(RRpos<0) = NaN;%0; + RRpos(RRpos<0) = NaN; RRneg = smoothingErrorReal; - RRneg(RRneg>0) = NaN;%0; + RRneg(RRneg>0) = NaN; nexttile hold on @@ -330,8 +330,14 @@ for f = 3:4 end %% stroke volumes -nexttile([2 1]) +swarmwidth = 0.25; +grey = [0.65 0.65 0.65]; +black = [0.05 0.05 0.05]; +yellow = [0.5 0.5 0.8]; + +nexttile hold on +yline(0,'-'); ylabel('Stroke volume error (%)') mverrAbs_syst = SV_MV_systonly-trapz(trueData.MV.time,trueData.MV.mean); averrAbs_syst = SV_AV_systonly-trapz(trueData.AV.time,trueData.AV.mean); @@ -341,25 +347,24 @@ mverrAbs_systP = 100*mverrAbs_syst./trapz(trueData.MV.time,trueData.MV.mean); averrAbs_systP = 100*averrAbs_syst./trapz(trueData.AV.time,trueData.AV.mean); aaerrAbs_systP = 100*aaerrAbs_syst./trapz(trueData.AA.time,trueData.AA.mean); pverrAbs_systP = 100*pverrAbs_syst./trapz(trueData.PV.time,trueData.PV.mean); -swarmchart(1.2.*ones(size(mverrAbs_systP)),mverrAbs_systP,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -swarmchart(2.2.*ones(size(mverrAbs_systP)),averrAbs_systP,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -swarmchart(3.2.*ones(size(mverrAbs_systP)),aaerrAbs_systP,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -ss=swarmchart(4.2.*ones(size(mverrAbs_systP)),pverrAbs_systP,2,[0.5 0.5 0],'*','XJitterWidth',0.10); +swarmchart((1+swarmwidth).*ones(size(mverrAbs_systP)),mverrAbs_systP,2,yellow,'filled','XJitterWidth',swarmwidth) +swarmchart((2+swarmwidth).*ones(size(mverrAbs_systP)),averrAbs_systP,2,yellow,'filled','XJitterWidth',swarmwidth) +swarmchart((3+swarmwidth).*ones(size(mverrAbs_systP)),aaerrAbs_systP,2,yellow,'filled','XJitterWidth',swarmwidth) +ss=swarmchart((4+swarmwidth).*ones(size(mverrAbs_systP)),pverrAbs_systP,2,yellow,'filled','XJitterWidth',swarmwidth); mverr = 100*(SV_MV-trapz(trueData.MV.time,trueData.MV.mean))./trapz(trueData.MV.time,trueData.MV.mean); averr = 100*(SV_AV-trapz(trueData.AV.time,trueData.AV.mean))./trapz(trueData.AV.time,trueData.AV.mean); aaerr = 100*(SV_AA-trapz(trueData.AA.time,trueData.AA.mean))./trapz(trueData.AA.time,trueData.AA.mean); pverr = 100*(SV_PV-trapz(trueData.PV.time,trueData.PV.mean))./trapz(trueData.PV.time,trueData.PV.mean); -s=swarmchart(1.*ones(size(mverr)),mverr,2,[0.5 0.5 1],'*','XJitterWidth',0.10); -swarmchart(2.*ones(size(mverr)),averr,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(3.*ones(size(mverr)),aaerr,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(4.*ones(size(mverr)),pverr,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -yline(0,'--'); +s=swarmchart(1.*ones(size(mverr)),mverr,2,grey,'filled','XJitterWidth',swarmwidth); +swarmchart(2.*ones(size(mverr)),averr,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(3.*ones(size(mverr)),aaerr,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(4.*ones(size(mverr)),pverr,2,grey,'filled','XJitterWidth',swarmwidth) -errorbar(1,mean(mverr),std(mverr),'k*','LineWidth',1,'markersize',5) -errorbar(2,mean(averr),std(averr),'k*','LineWidth',1,'markersize',5) -errorbar(3,mean(aaerr),std(aaerr),'k*','LineWidth',1,'markersize',5) -er=errorbar(4,mean(pverr),std(pverr),'k*','LineWidth',1,'markersize',5); +errorbar(1,mean(mverr),std(mverr),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(2,mean(averr),std(averr),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(3,mean(aaerr),std(aaerr),'.','color',black,'LineWidth',1,'markersize',5) +er=errorbar(4,mean(pverr),std(pverr),'.','color',black,'LineWidth',1,'markersize',5); mverrAbs_rand = SV_MV_randonly-trapz(trueData.MV.time,trueData.MV.mean); averrAbs_rand = SV_AV_randonly-trapz(trueData.AV.time,trueData.AV.mean); @@ -369,17 +374,23 @@ mverrAbs_randP = 100*mverrAbs_rand./trapz(trueData.MV.time,trueData.MV.mean); averrAbs_randP = 100*averrAbs_rand./trapz(trueData.AV.time,trueData.AV.mean); aaerrAbs_randP = 100*aaerrAbs_rand./trapz(trueData.AA.time,trueData.AA.mean); pverrAbs_randP = 100*pverrAbs_rand./trapz(trueData.PV.time,trueData.PV.mean); -swarmchart(1.4.*ones(size(mverrAbs_randP)),mverrAbs_randP,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -swarmchart(2.4.*ones(size(mverrAbs_randP)),averrAbs_randP,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -swarmchart(3.4.*ones(size(mverrAbs_randP)),aaerrAbs_randP,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -sr=swarmchart(4.4.*ones(size(mverrAbs_randP)),pverrAbs_randP,2,[0.4 0 0.2],'*','XJitterWidth',0.10); +swarmchart((1+swarmwidth*2).*ones(size(mverrAbs_randP)),mverrAbs_randP,2,black,'filled','XJitterWidth',swarmwidth) +swarmchart((2+swarmwidth*2).*ones(size(mverrAbs_randP)),averrAbs_randP,2,black,'filled','XJitterWidth',swarmwidth) +swarmchart((3+swarmwidth*2).*ones(size(mverrAbs_randP)),aaerrAbs_randP,2,black,'filled','XJitterWidth',swarmwidth) +sr=swarmchart((4+swarmwidth*2).*ones(size(mverrAbs_randP)),pverrAbs_randP,2,black,'filled','XJitterWidth',swarmwidth); -xticks([1:4]) +xticks([1:4]+swarmwidth) xticklabels({'MV','AV','AA','PV'}) yline(5,'--'); yline(-5,'--'); +xline(2-swarmwidth,':'); +xline(3-swarmwidth,':'); +xline(4-swarmwidth,':'); set(gca,'FontSize',9) -xlim([0.5 4.5]) +xlim([1-swarmwidth 4+swarmwidth*3]) +yticks(-30:10:30) +ylim([-30,30]) + t=title('E','FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; @@ -387,9 +398,10 @@ pos = t.Position; pos(1) = pos(1)-0.6; t.Position = pos; - -nexttile([2 1]) +%---- +nexttile%([2 1]) hold on +yline(0,'-'); ylabel('Stroke volume difference (%)') diffMVAV_systonly = 100*(SV_MV_systonly-SV_AV_systonly)./mean([SV_MV_systonly,SV_AV_systonly],2); diffMVAA_systonly = 100*(SV_MV_systonly-SV_AA_systonly)./mean([SV_MV_systonly,SV_AA_systonly],2); @@ -397,12 +409,12 @@ diffMVPV_systonly = 100*(SV_MV_systonly-SV_PV_systonly)./mean([SV_MV_systonly,SV diffAVAA_systonly = 100*(SV_AV_systonly-SV_AA_systonly)./mean([SV_AV_systonly,SV_AA_systonly],2); diffAVPV_systonly = 100*(SV_AV_systonly-SV_PV_systonly)./mean([SV_AV_systonly,SV_PV_systonly],2); diffAAPV_systonly = 100*(SV_AA_systonly-SV_PV_systonly)./mean([SV_AA_systonly,SV_PV_systonly],2); -swarmchart(1.2.*ones(size(diffMVAV_systonly)),diffMVAV_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -swarmchart(2.2.*ones(size(diffMVAV_systonly)),diffMVAA_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -swarmchart(3.2.*ones(size(diffMVAV_systonly)),diffMVPV_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -ss=swarmchart(4.2.*ones(size(diffMVAV_systonly)),diffAVAA_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10); -swarmchart(5.2.*ones(size(diffMVAV_systonly)),diffAVPV_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10) -swarmchart(6.2.*ones(size(diffMVAV_systonly)),diffAAPV_systonly,2,[0.5 0.5 0],'*','XJitterWidth',0.10) +swarmchart((1+swarmwidth).*ones(size(diffMVAV_systonly)),diffMVAV_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth) +swarmchart((2+swarmwidth).*ones(size(diffMVAV_systonly)),diffMVAA_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth) +swarmchart((3+swarmwidth).*ones(size(diffMVAV_systonly)),diffMVPV_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth) +ss=swarmchart((4+swarmwidth).*ones(size(diffMVAV_systonly)),diffAVAA_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth); +swarmchart((5+swarmwidth).*ones(size(diffMVAV_systonly)),diffAVPV_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth) +swarmchart((6+swarmwidth).*ones(size(diffMVAV_systonly)),diffAAPV_systonly,2,yellow,'o','filled','XJitterWidth',swarmwidth) diffMVAV = 100*(SV_MV-SV_AV)./mean([SV_MV,SV_AV],2); diffMVAA = 100*(SV_MV-SV_AA)./mean([SV_MV,SV_AA],2); @@ -411,19 +423,19 @@ diffAVAA = 100*(SV_AV-SV_AA)./mean([SV_AV,SV_AA],2); diffAVPV = 100*(SV_AV-SV_PV)./mean([SV_AV,SV_PV],2); diffAAPV = 100*(SV_AA-SV_PV)./mean([SV_AA,SV_PV],2); -swarmchart(1.*ones(size(SV_MV)),100*(SV_MV-SV_AV)./SV_MV,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(2.*ones(size(SV_MV)),100*(SV_MV-SV_AA)./SV_MV,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(3.*ones(size(SV_MV)),100*(SV_MV-SV_PV)./SV_MV,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(4.*ones(size(SV_MV)), 100*(SV_AV-SV_AA)./SV_AV,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(5.*ones(size(SV_MV)), 100*(SV_AV-SV_PV)./SV_AV,2,[0.5 0.5 1],'*','XJitterWidth',0.10) -swarmchart(6.*ones(size(SV_MV)), 100*(SV_AA-SV_PV)./SV_AA,2,[0.5 0.5 1],'*','XJitterWidth',0.10) +swarmchart(1.*ones(size(SV_MV)),100*(SV_MV-SV_AV)./SV_MV,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(2.*ones(size(SV_MV)),100*(SV_MV-SV_AA)./SV_MV,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(3.*ones(size(SV_MV)),100*(SV_MV-SV_PV)./SV_MV,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(4.*ones(size(SV_MV)), 100*(SV_AV-SV_AA)./SV_AV,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(5.*ones(size(SV_MV)), 100*(SV_AV-SV_PV)./SV_AV,2,grey,'filled','XJitterWidth',swarmwidth) +swarmchart(6.*ones(size(SV_MV)), 100*(SV_AA-SV_PV)./SV_AA,2,grey,'filled','XJitterWidth',swarmwidth) -errorbar(1,mean(diffMVAV),std(diffMVAV),'k*','LineWidth',1,'markersize',5) -errorbar(2,mean(diffMVAA),std(diffMVAA),'k*','LineWidth',1,'markersize',5) -errorbar(3,mean(diffMVPV),std(diffMVPV),'k*','LineWidth',1,'markersize',5) -errorbar(4,mean(diffAVAA),std(diffAVAA),'k*','LineWidth',1,'markersize',5) -errorbar(5,mean(diffAVPV),std(diffAVPV),'k*','LineWidth',1,'markersize',5) -errorbar(6,mean(diffAAPV),std(diffAAPV),'k*','LineWidth',1,'markersize',5) +errorbar(1,mean(diffMVAV),std(diffMVAV),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(2,mean(diffMVAA),std(diffMVAA),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(3,mean(diffMVPV),std(diffMVPV),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(4,mean(diffAVAA),std(diffAVAA),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(5,mean(diffAVPV),std(diffAVPV),'.','color',black,'LineWidth',1,'markersize',5) +errorbar(6,mean(diffAAPV),std(diffAAPV),'.','color',black,'LineWidth',1,'markersize',5) diffMVAV_randonly = 100*(SV_MV_randonly-SV_AV_randonly)./mean([SV_MV_randonly,SV_AV_randonly],2); diffMVAA_randonly = 100*(SV_MV_randonly-SV_AA_randonly)./mean([SV_MV_randonly,SV_AA_randonly],2); @@ -431,23 +443,30 @@ diffMVPV_randonly = 100*(SV_MV_randonly-SV_PV_randonly)./mean([SV_MV_randonly,SV diffAVAA_randonly = 100*(SV_AV_randonly-SV_AA_randonly)./mean([SV_AV_randonly,SV_AA_randonly],2); diffAVPV_randonly = 100*(SV_AV_randonly-SV_PV_randonly)./mean([SV_AV_randonly,SV_PV_randonly],2); diffAAPV_randonly = 100*(SV_AA_randonly-SV_PV_randonly)./mean([SV_AA_randonly,SV_PV_randonly],2); -swarmchart(1.4.*ones(size(diffMVAV_randonly)),diffMVAV_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -swarmchart(2.4.*ones(size(diffMVAV_randonly)),diffMVAA_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -swarmchart(3.4.*ones(size(diffMVAV_randonly)),diffMVPV_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -sr=swarmchart(4.4.*ones(size(diffMVAV_randonly)),diffAVAA_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10); -swarmchart(5.4.*ones(size(diffMVAV_randonly)),diffAVPV_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10) -swarmchart(6.4.*ones(size(diffMVAV_randonly)),diffAAPV_randonly,2,[0.4 0 0.2],'*','XJitterWidth',0.10) +swarmchart((1+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffMVAV_randonly,2,black,'filled','XJitterWidth',swarmwidth) +swarmchart((2+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffMVAA_randonly,2,black,'filled','XJitterWidth',swarmwidth) +swarmchart((3+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffMVPV_randonly,2,black,'filled','XJitterWidth',swarmwidth) +sr=swarmchart((4+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffAVAA_randonly,2,black,'filled','XJitterWidth',swarmwidth); +swarmchart((5+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffAVPV_randonly,2,black,'filled','XJitterWidth',swarmwidth) +swarmchart((6+swarmwidth*2).*ones(size(diffMVAV_randonly)),diffAAPV_randonly,2,black,'filled','XJitterWidth',swarmwidth) yline(5,'--'); -yline(-5,'--'); -yline(0,'--'); - -xlim([0.5 6.5]) -xticks([1:6]) +line = yline(-5,'--'); +% yline(0,'--'); +xline(2-swarmwidth,':'); +xline(3-swarmwidth,':'); +xline(4-swarmwidth,':'); +xline(5-swarmwidth,':'); +xline(6-swarmwidth,':'); + +xlim([1-swarmwidth 6+swarmwidth*3]) +xticks([1:6]+swarmwidth) xticklabels({'MV-AV','MV-AA','MV-PV','AV-AA','AV-PV','AA-PV'}) -legend([s(1);er;sr(1);ss(1)],{'All errors','Mean+-sd of all','Random error',... - 'Systematic error'},'location','northoutside','Numcolumns',2,... - 'Position',[0.0872432573356074 0.284542914516151 0.4 0.04]) +yticks(-40:10:40) +ylim([-40,40]) +legend([s(1);er;sr(1);ss(1);line],{'All errors','Mean+-sd of all errors','Random errors',... + 'Systematic errors','5% error'},'location','northoutside','Numcolumns',2,... + 'Position',[0.0461550220414897 0.11602368374692 0.4 0.04]) set(gca,'FontSize',9) t=title('F','FontSize',12); ax = gca; diff --git a/Plotting/plotPL_realdata.m b/Plotting/plotPL_realdata.m index ce89df75973f52910b30ef9458588ff618ea4ea7..b2eb9025eacb67aa04db4a29c9a181e1374ec1f2 100644 --- a/Plotting/plotPL_realdata.m +++ b/Plotting/plotPL_realdata.m @@ -34,7 +34,7 @@ paramNamesPlotNice = {'Caa', 'Rao','m2_L_V','ksystLV','EmaxLA','Cpvc'}; experimentNames = {'E_dataP78','E_dataP1','E_dataP3','E_dataP24','E_dataP36','E_dataP33'}; -plotNames = {'Control 1','Control 2','Control 3','T2D+HT 1','T2D+HT 2','T2D+HT 3'}; +plotNames = {'C1','C2','C3','P1','P2','P3'}; units.param = {'ml/mmHg','mmHg*s/ml','mmHg*s/ml','mmHg*s^2/ml','mmHg*s/ml',... 'ml/mmHg','cm^2','ml/mmHg','ml/mmHg','ml/mmHg','ml/mmHg','ml/mmHg',... @@ -156,7 +156,6 @@ for i = 1:length(paramNamesPlot) end if lb(p,e) > ub(p,comp) || ub(p,e) < lb(p,comp) %no overlapping confidence intervals, definetely different between these subjects signp{e,comp} = '**'; - % sign(comp,e) = '**'; elseif middlep > ub(p,comp) || middlep < lb(p,comp) %less than half overlapping, probably different (~ p=0.05) signp{e,comp} = '*'; else % overlapping more than half, probably not different ( ~ p > 0.05) @@ -168,6 +167,7 @@ for i = 1:length(paramNamesPlot) end %% Plot results figure for publication +linespace=0.05; darkpurple = [0.9 0.5 0.9].*0.4; lightpurple = [1 0.7 1]; l = length(experimentNames); @@ -177,25 +177,35 @@ letters = 'A':'Z'; figure('Name','Fig7_ProfileLikelihood_clinicalexample') set(gcf,'Color','white') xdim_CM = 17; -ydim_CM = 12+5+3; +ydim_CM = 12+3; set(gcf,'Units','centimeters','Position',[0 0 xdim_CM ydim_CM]) set(gcf,'PaperUnits', 'centimeters', 'PaperSize', [xdim_CM, ydim_CM]) -tiledlayout(4,6,'TileSpacing','loose','Padding','compact') +tiledlayout(3,12,'TileSpacing','loose','Padding','compact') +%example +nexttile([1,3]) +axis('off') + +% results for i = 1:length(paramNamesPlot) p = find(ismember(paramNames,paramNamesPlot{i})); + if i == 4 + nexttile([1,3]); + axis('off') + end ax1=nexttile([1,3]); hold on ylabel([paramNamesPlotNice{i} ' (' units.param{p} ')']) for e = 1:length(experimentNames) + xl=xline(e,':','Color',[0.1 0.1 0.1],'linewidth',0.8); middlep = lb(p,e)+ ((ub(p,e)-lb(p,e))/2); sd = (ub(p,e)-middlep) / 1.96; %95% conf interval corresponds to 1.96 sd if e > 3 % patient - errorbar(e,middlep,sd,'.','color',purplegradient(end,:),'linewidth',2) - plot(e,bestparam(e,p),'o','color',purplegradient(end,:),'MarkerFaceColor',purplegradient(end,:),'MarkerSize',3) + pe=errorbar(e,middlep,sd,'.','color',darkpurple,'linewidth',1.1,'markersize',1); + pb=plot(e,bestparam(e,p),'o','color',darkpurple,'MarkerFaceColor',darkpurple,'MarkerSize',3); else % control - errorbar(e,middlep,sd,'.','color',purplegradient(1,:),'linewidth',2) - plot(e,bestparam(e,p),'o','color',purplegradient(1,:),'MarkerFaceColor',purplegradient(1,:),'MarkerSize',3) + ce=errorbar(e,middlep,sd,'.','color',lightpurple.*0.9,'linewidth',1.1,'markersize',1); + cb=plot(e,bestparam(e,p),'o','color',lightpurple.*0.9,'MarkerFaceColor',lightpurple.*0.9,'MarkerSize',3); end end xticks(1:length(plotNames)) @@ -215,17 +225,24 @@ for i = 1:length(paramNamesPlot) y1 = min(lb(p,:))*0.95; end yticks([y1 y2]); - yd = 0.05*(length(comps)-1) + 1; + s=strcmp(sign{i},'**'); + numsign = sum(s(:)); + yd = linespace*(numsign) + 1 + (linespace*0.9)*length(experimentNames); ymax = max(ub(p,:))*(yd+0.02)*1.01; ymax = max(max(ub(p,:))*1.05,ymax); ylim([min(lb(p,:))*0.95,ymax]) %significance + yd=1; + startingc = 1; for c = 1:length(comps) - yd = 0.05*(c-1) + 1; if strcmp(sign{i}(comps{c}(1),comps{c}(2)),'**') - plot(comps{c},[max(ub(p,:))*yd,max(ub(p,:))*yd],'k-') - plot(mean(comps{c}),max(ub(p,:))*(yd+0.02),'k*','markersize',4,'linewidth',0.5) + if startingc ~= comps{c}(1) + yd = yd+linespace; + end + startingc = comps{c}(1); + yd = yd+linespace; + psign=plot(comps{c},[max(ub(p,:))*yd,max(ub(p,:))*yd],'k-'); end end set(gca,'FontSize',9,'FontName','Calibri') @@ -233,33 +250,37 @@ for i = 1:length(paramNamesPlot) ax1.TitleHorizontalAlignment = 'left'; if i ==1 - legend({'Standard deivation (sd)','Best fit to data','No overlapping CI'},'Location','Northwest') + legend([xl,cb,ce,pb,pe,psign],... + {sprintf('C: control\nP: HT+T2D'),'Standard deivation (C)','Best fit to data (C)','Standard deivation (P)','Best fit to data (P)','No overlapping CI'},... + 'Position',[0.02 0.415931811460952 0.2 0.19],'box','off') end end lettersend =i; + % percent plot green = [0 0.55 0.35]; for i = 1:length(paramNamesPlot) p = find(ismember(paramNames,paramNamesPlot{i})); - ax1=nexttile; + ax1=nexttile([1 2]); hold on meanbestparam = mean(bestparam(:,p)); middlep = lb(p,:)+ ((ub(p,:)-lb(p,:))./2); sd = (ub(p,:)-middlep) / 1.96; %95% conf interval corresponds to 1.96 sd percP = 100* (sd./meanbestparam ); - bar([perc(i),percAll(i)],'FaceColor',green) - errorbar([perc(i),percAll(i)],[std(percP),0],'k.') + b1=bar(1,perc(i),'FaceColor',[184 84 184]./255); + b2=bar(2,percAll(i),'FaceColor',green); + + e1=errorbar([perc(i),percAll(i)],[std(percP),0],'k.'); ylabel(['% of mean ' paramNamesPlotNice{i}]) - xticks([1,2]) - xticklabels({'Individual sd','Cohort sd'}) + xticks([]) set(gca,'FontSize',9,'FontName','Calibri') title(letters(i+lettersend),'FontSize',11,'FontName','Calibri') ax1.TitleHorizontalAlignment = 'left'; end - +legend([b1,e1,b2],{sprintf('Individual\nstandard\ndeviation\n '),sprintf('Variation\namong\nindividuals\n '),sprintf('Cohort\nstandard\ndeviation\n ')},'Position',[0.925 0.12 0.05 0.23],'box','off') %% Save and close all figures if saveFigs diff --git a/Plotting/plotProfileLikelihood.m b/Plotting/plotProfileLikelihood.m index 69eff63c725b6766b6e85eb39a625d39a926add1..a95060f304590eb8f653aa4c5288ca393964423c 100644 --- a/Plotting/plotProfileLikelihood.m +++ b/Plotting/plotProfileLikelihood.m @@ -222,8 +222,8 @@ darkpurple = [0.9 0.5 0.9].*0.4; lightpurple = [1 0.7 1]; purplegradient = [linspace(lightpurple(1),darkpurple(1),l)', linspace(lightpurple(2),darkpurple(2),l)', linspace(lightpurple(3),darkpurple(3),l)']; -selectedParamNames = {'k_diast_LA','m2_LV','Caa'}; -selectedParamNamesPlot = {'k_d_i_a_s_t__L_A','m2_L_V','Caa'}; +selectedParamNames = {'Emin_LA','m2_LV','Caa'}; +selectedParamNamesPlot = {'Emin_L_A','m2_L_V','Caa'}; figure('Name',['Fig6_methodevaluation_summary_' experimentName]) set(gcf,'Color','white') xdim_CM = 17; @@ -262,7 +262,7 @@ for i = 1:length(selectedParamNamesPlot) end end xline(trueData.allParameters(p),'--','LineWidth',1.2,'color',[0 0.5 0]); - xlabel([paramNamesPlot{ismember(paramNamesPlot,paramNames(p))} ' (value)']) + xlabel([selectedParamNamesPlot{ismember(selectedParamNames,paramNames(p))} ' (value)']) ylabel('Sampled data n.') % full PL @@ -283,7 +283,7 @@ for i = 1:length(selectedParamNamesPlot) end end truep = xline(trueData.allParameters(p),'--','LineWidth',1.2,'color',[0 0.5 0]); - xlabel([paramNamesPlot{ismember(paramNamesPlot,paramNames(p))} ' (value)']) + xlabel([selectedParamNamesPlot{ismember(selectedParamNames,paramNames(p))} ' (value)']) ylabel('Obj. func value') end legend([okparamp,notokparamp,truep],sprintf('Found true\nvalue'),sprintf('Didn''t find\n true value'),'True value',... diff --git a/Plotting/plotSampledData.m b/Plotting/plotSampledData.m index eba7993ff322548771756d56fa0060dea9c73604..41060488baa0c8e8ee47ae0c1e7fc62615d1b577 100644 --- a/Plotting/plotSampledData.m +++ b/Plotting/plotSampledData.m @@ -37,12 +37,12 @@ greenCol = [0 0 0]; figure('Name',sprintf('True simulated data + %d sampled (%s)',length(estimationData),experimentName)) set(gcf,'Color','white') xdim_CM = 17; -ydim_CM = 17; +ydim_CM = 11; set(gcf,'Units','centimeters','Position',[0 0 xdim_CM ydim_CM]) set(gcf,'PaperUnits', 'centimeters', 'PaperSize', [xdim_CM, ydim_CM]) -tiledlayout(3,6,'TileSpacing','loose','Padding','compact') +tiledlayout(4,6,'TileSpacing','compact','Padding','compact') -nexttile([1,3]) +nexttile([2,2]) hold on for i = 1:length(estimationData) plot(estimationData{i}.MV.time,estimationData{i}.MV.mean,'.-','color',colors(i,:),'Markersize',12,'LineWidth',1) @@ -52,7 +52,7 @@ ylabel('Blood flow in MV (mL/s)') xlabel('Time (s)') tend = trueData.MV.time(end); xlim([0 tend]) -set(gca,'FontSize',10) +set(gca,'FontSize',8) t=title('A','FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; @@ -60,7 +60,7 @@ pos = t.Position; pos(1) = pos(1)-0.16; t.Position = pos; -nexttile([1,3]) +nexttile([2,2]) hold on for i = 1:length(estimationData) est(i)=plot(estimationData{i}.AV.time,estimationData{i}.AV.mean,'.-','color',colors(i,:),'Markersize',12,'LineWidth',1); @@ -70,10 +70,10 @@ ylabel('Blood flow in AV (mL/s)') xlabel('Time (s)') n = split(sprintf('Sampled data %dx',1:length(estimationData)),'x'); legend([est,trueplot],[n(1:end-1);{'True data'}], ... - 'Position',[0.75395269610321 0.754276960784314 0.22 0.23]) + 'box','off','NumColumns',2,'Position',[0.65 0.798 0.33 0.2]) xlim([0 tend]) -set(gca,'FontSize',10) +set(gca,'FontSize',8) t=title('B','FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; @@ -81,16 +81,63 @@ pos = t.Position; pos(1) = pos(1)-0.16; t.Position = pos; -nexttile([1,3]) +nexttile +axis off +nexttile +axis off +%--- + +letters = {'i','ii','iii','iv','v','vi'}; +nexttile +hold on +for i = 1:step:length(estimationData) + plot(1,estimationData{i}.SBP.mean,'.','color',colors(i,:),'linewidth',0.9,'Markersize',14) + plot(2,estimationData{i}.DBP.mean,'.','color',colors(i,:),'linewidth',0.9,'Markersize',14) +end +plot(1,trueData.SBP.mean,'o','color',greenCol,'linewidth',2,'Markersize',5) +plot(2,trueData.DBP.mean,'o','color',greenCol,'linewidth',2,'Markersize',5) +ylabel(sprintf('Blood pressure\n (mmHg)')) +xticks([1,2]) +xticklabels({'SBP','DBP'}) +xlim([0 3]) +set(gca,'FontSize',8) +t=title(letters{1},'FontSize',12); +ax = gca; +ax.TitleHorizontalAlignment = 'left'; +pos = t.Position; +pos(1) = pos(1)-0.31; +t.Position = pos; + +pnames = fieldnames(trueData.parameters); +p = 1; +nexttile +hold on +for i = 1:length(estimationData) + plot(p,estimationData{i}.parameters.(pnames{p}).mean,'.','color',colors(i,:),'linewidth',1,'Markersize',14) +end +plot(p,trueData.parameters.(pnames{p}).mean,'o','color',greenCol,'linewidth',2,'Markersize',5) +ylabel(pnames{p}) +xticks([]) +set(gca,'FontSize',8) +t=title(letters(p+1),'FontSize',12); +ax = gca; +ax.TitleHorizontalAlignment = 'left'; +pos = t.Position; +pos(1) = pos(1)-1.5; +t.Position = pos; + +%--- + +nexttile([2,2]) hold on for i = 1:length(estimationData) - plot(estimationData{i}.AA.time,estimationData{i}.AA.mean,'.-','color',colors(i,:),'Markersize',12,'LineWidth',1) + plot(estimationData{i}.AA.time,estimationData{i}.AA.mean,'.-','color',colors(i,:),'Markersize',12,'LineWidth',1) end plot(trueData.AA.time,trueData.AA.mean,'o','color',greenCol,'linewidth',2,'Markersize',5) ylabel('Blood flow in AA (mL/s)') xlabel('Time (s)') xlim([0 tend]) -set(gca,'FontSize',10) +set(gca,'FontSize',8) t=title('C','FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; @@ -98,7 +145,7 @@ pos = t.Position; pos(1) = pos(1)-0.16; t.Position = pos; -nexttile([1,3]) +nexttile([2,2]) hold on for i = 1:length(estimationData) plot(estimationData{i}.PV.time,estimationData{i}.PV.mean,'.-','color',colors(i,:),'Markersize',12,'LineWidth',1) @@ -107,7 +154,7 @@ plot(trueData.PV.time,trueData.PV.mean,'o','color',greenCol,'linewidth',2,'Marke ylabel('Blood flow in PV (mL/s)') xlabel('Time (s)') xlim([0 tend]) -set(gca,'FontSize',10) +set(gca,'FontSize',8) t=title('D','FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; @@ -116,29 +163,9 @@ pos(1) = pos(1)-0.16; t.Position = pos; -nexttile -hold on -for i = 1:step:length(estimationData) - plot(1,estimationData{i}.SBP.mean,'.','color',colors(i,:),'linewidth',0.9,'Markersize',14) - plot(2,estimationData{i}.DBP.mean,'.','color',colors(i,:),'linewidth',0.9,'Markersize',14) -end -plot(1,trueData.SBP.mean,'o','color',greenCol,'linewidth',2,'Markersize',5) -plot(2,trueData.DBP.mean,'o','color',greenCol,'linewidth',2,'Markersize',5) -ylabel('Blood pressure (mmHg)') -xticks([1,2]) -xticklabels({'SBP','DBP'}) -xlim([0 3]) -set(gca,'FontSize',10) -t=title('E','FontSize',12); -ax = gca; -ax.TitleHorizontalAlignment = 'left'; -pos = t.Position; -pos(1) = pos(1)-0.31; -t.Position = pos; +%---- -pnames = fieldnames(trueData.parameters); -letters = 'F':'Z'; -for p = 1:length(pnames) +for p = 2:length(pnames) nexttile hold on for i = 1:length(estimationData) @@ -147,8 +174,8 @@ for p = 1:length(pnames) plot(p,trueData.parameters.(pnames{p}).mean,'o','color',greenCol,'linewidth',2,'Markersize',5) ylabel(pnames{p}) xticks([]) - set(gca,'FontSize',10) - t=title(letters(p),'FontSize',12); + set(gca,'FontSize',8) + t=title(letters(p+1),'FontSize',12); ax = gca; ax.TitleHorizontalAlignment = 'left'; pos = t.Position;