diff --git a/CWLocationString.m b/CWLocationString.m new file mode 100755 index 0000000..dab75ef --- /dev/null +++ b/CWLocationString.m @@ -0,0 +1,23 @@ +function locStr=CWLocationString(pt_name,tar_loc), + +locStr=''; +%# Patients with non-standard DVH names +anom_pts = {'Cohen','Lapid','Menaker','Pisano','Sutton','Underkoffler'}; + +matches = strcmp(anom_pts,pt_name); + +if sum(matches)>0, + if tar_loc(2)=='U', + locStr='CW2SUP'; + else + locStr='CW2INF'; + end +else %# not anomoly, just determine L/R + if tar_loc(1)=='R', + locStr='CW2RT'; + else + locStr='CW2LT'; + end +end + +end diff --git a/CWPDataIntegration.m b/CWPDataIntegration.m new file mode 100755 index 0000000..7ef7f3c --- /dev/null +++ b/CWPDataIntegration.m @@ -0,0 +1,171 @@ +function CWPDataIntegration +tic; +% parameters + dvhdef={'2cmExp';'Colorado'}; + + b2a = 0; + +% load patient info stored in the spread sheet + fn='Z:/Fan/Andy/Ken/meta/20100424CWFinalCohort'; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + try + load(fn,'xlsraw'); + catch + [~,~,xlsraw]=xlsread([fn,'.xlsx'],'sheet1'); + save(fn,'xlsraw'); + end + +% pick up related data from the spread sheet + PtInfo = classDataFromXls(); + PtInfo.mXlsRaw = xlsraw; + % identity + PtInfo.mColName = 'Patient Last Name'; + PtInfo = PtInfo.fExtractColData(); + flgptcode = PtInfo.mFlgDataRows; + ptcode = PtInfo.mColData; + % Number of Fractions + PtInfo.mColName = 'Number of Fractions'; + PtInfo = PtInfo.fExtractColData(); + flgfx = PtInfo.mFlgDataRows; + fx = zeros(size(flgfx)); + fx(flgfx) = cell2mat(PtInfo.mColData(flgfx)); + % Date of Birth + PtInfo.mColName = 'Date of Birth'; + PtInfo = PtInfo.fExtractColData(); + flgdatebirth = PtInfo.mFlgDataRows; + datebirth = zeros(size(flgdatebirth)); + f = PtInfo.mColData(flgdatebirth); + datebirth(flgdatebirth) = datenum(f); + % IGRT Start Date + PtInfo.mColName = 'IGRT Start Date'; + PtInfo = PtInfo.fExtractColData(); + flgdateIGRT = PtInfo.mFlgDataRows; + dateIGRT = zeros(size(flgdateIGRT)); + f = PtInfo.mColData(flgdateIGRT); + dateIGRT(flgdateIGRT) = datenum(f); + % Last Follow Up Date + PtInfo.mColName = 'Surv Date'; + PtInfo = PtInfo.fExtractColData(); + flgdatefu = PtInfo.mFlgDataRows; + datefu = zeros(size(flgdatefu)); + datefu(flgdatefu) = datenum(PtInfo.mColData(flgdatefu)); + % complication grade 3 + PtInfo.mColName = 'Pain Grade 3'; + PtInfo = PtInfo.fExtractColData(); + datepain = inf(size(PtInfo.mColData)); + flgcensor = true(size(datefu)); + f = PtInfo.mFlgDataRows; + datepain(f) = datenum(PtInfo.mColData(f)); + flgcensor(f) = false; + % complication grade 2 + PtInfo.mColName = 'Pain Grade 2'; + PtInfo = PtInfo.fExtractColData(); + f = PtInfo.mFlgDataRows; + datepain(f) = datenum(PtInfo.mColData(f)); + flgcensor(f) = false; + % relapse date + PtInfo.mColName = 'Local Failure'; + PtInfo = PtInfo.fExtractColData(); + f = PtInfo.mFlgDataRows; + flgfailure = false(size(f)); + flgfailure(f) = cell2mat(PtInfo.mColData(f)); + PtInfo.mColName = 'Local Failure Date'; + PtInfo = PtInfo.fExtractColData(); + flgrelapse = PtInfo.mFlgDataRows; + datefailure = inf(size(flgrelapse)); + datefailure(flgrelapse&flgfailure) = datenum(PtInfo.mColData(flgrelapse&flgfailure)); + flgrelapse = flgrelapse&f; + % gender + PtInfo.mColName = 'Sex'; + PtInfo = PtInfo.fExtractColData(); + flggender = PtInfo.mFlgDataRows; + ptgender = PtInfo.mColData; + % death date + PtInfo.mColName = 'Surv alive 0, dead 1'; + PtInfo = PtInfo.fExtractColData(); + f1 = PtInfo.mFlgDataRows; + flgdeath = false(size(f1)); + flgdeath(f1) = cell2mat(PtInfo.mColData(f1)); + PtInfo.mColName = 'death Date'; + PtInfo = PtInfo.fExtractColData(); + f = PtInfo.mFlgDataRows; + datedeath = inf(size(f)); + datedeath(f&flgdeath) = datenum(PtInfo.mColData(f&flgdeath)); + flgdeath = f1&f; + + % common part of those data + flg = flgptcode & flgfx & flgdatebirth & flgdateIGRT & flgdatefu & flgrelapse & flggender & flgdeath; + ptcode=ptcode(flg); + fx=fx(flg); + datebirth=datebirth(flg); + dateIGRT=dateIGRT(flg); + datefu=datefu(flg); + datepain=datepain(flg); + flgcensor=flgcensor(flg); + datefailure = datefailure(flg); + ptgender = ptgender(flg); + datedeath = datedeath(flg); + +% patient DVH and objects + CGobj_org=classEndPointGroup(); + CGobj_org.mBeta2Alpha = b2a; + for m=1:length(dvhdef) % iterate with each definition + % load dvh info + fn=['G:/MSKCC/Andy/Ken/meta/DVH_',dvhdef{m}]; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + load(fn,'DVH'); + + % match patients DVH and .xls + [f1,g1]=ismember(ptcode,DVH(:,1)); + [f2,g2]=ismember(DVH(:,1),ptcode); + if length(unique(g2(g2~=0)))~=length(find(g2))% || length(unique(g2~=0))~=length(find(g2)) + error('The patient ids are not unique'); + end + if ~( all(f1) && all(f2) ) + disp('The patients in the spread sheet do not match with those in DVH curves, take the common part'); + % use common part only + DVH=DVH(f2,:); + ptcode=ptcode(f1); fx=fx(f1); datebirth=datebirth(f1); dateIGRT=dateIGRT(f1); datefu=datefu(f1); datepain=datepain(f1); flgcensor=flgcensor(f1); + [~,g1]=ismember(ptcode,DVH(:,1)); + end + + % combine info from DVH and .xls to form complicationgroup object + CIobjs = classEndPointIndividual(); + CIobjs = repmat(CIobjs,[size(DVH,1),1]); + for n = 1:size(DVH,1) + CIobjs(n,1).mID=ptcode{n}; + CIobjs(n,1).mDoseBins_org=DVH{g1(n),2}(:,1); + CIobjs(n,1).mVolDiff=DVH{g1(n),2}(:,2); + CIobjs(n,1).mVolCum=DVH{g1(n),2}(:,3); + CIobjs(n,1).mFxNum=fx(n); + % CIobjs(n,1).DoseStep = dosestep; + % CIobjs(n,1).VolStep = volstep; + CIobjs(n,1).mDateBirth = datebirth(n); + CIobjs(n,1).mDateBaseline = dateIGRT(n); + CIobjs(n,1).mDateComp = datepain(n); + CIobjs(n,1).mDateLastFollowup = datefu(n); + CIobjs(n,1).mFlgCensor = flgcensor(n); + CIobjs(n,1).mDateRelapse = datefailure(n); + CIobjs(n,1).mGender = ptgender(n); + CIobjs(n,1).mDateDeath = datedeath(n); + end + if any([CIobjs.mFxNum]==0) + error('Fraction number is zeros'); + end + CGobj = CGobj_org.fAddPatient(CIobjs); + + % save result + CGstrct = ObjToStruct(CGobj); + fn=['G:/MSKCC/Andy/Ken/tom/CW_',dvhdef{m},'.mat']; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + save(fn,'CGobj','CGstrct'); + disp(fn); + end +toc; +end \ No newline at end of file diff --git a/CWP_IHME_etc.m b/CWP_IHME_etc.m new file mode 100755 index 0000000..8423c00 --- /dev/null +++ b/CWP_IHME_etc.m @@ -0,0 +1,246 @@ +function CWP_IHME_etc + +tic; +fig_loc = 'Z:/elw/MATLAB/cw_analy/slides/figures/latest/'; +do_print=true; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +cwp_def = 'MUTTER'; + +%a2b='Inf'; +a2b='2.1'; + +%fn = {strcat(cwp_def,'_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat')}; +fn = {[cwp_def,'_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b',a2b,'.mat']}; + +%vxdx_cphm_mat_str=strcat(fp,strcat(cwp_def,'_CW_VxDx_CoxPHM.mat')); + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +load(strcat(fp,fn{1}),'CGobj_current'); +CGobj = CGobj_current; +clear CGobj_current; + + +dpfx = [CGobj.mGrp.mDosePerFx]; +tx_data = [CGobj.mGrp.mDoseTx]'; +fx = [CGobj.mGrp.mFxNum]; +flgcensor = [CGobj.mGrp.mFlgCensor]'; + + + +%% V30 + tx CPH +%compdate = [txCox.data_hazard]; + +[VDxCox,flgCox,flganti] = CGobj.fCoxParameter_DVH('VDx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +VDxCox = VDxCox(flgCox); + +v30_ind=31; +if isequal(a2b,'2.1') + v30_ind=100; +end + +compdate = [VDxCox(v30_ind).data_hazard]; +v30_data = [VDxCox(v30_ind).data_exposure]; + + +[cur_betas,cur_logl,~,cur_stats]=... + coxphfit([v30_data tx_data],compdate,'baseline',0,'censoring',flgcensor); + +disp('V30 + Tx'); +disp('(beta,se,p-val)'); +disp(['v30: (',... + num2str(cur_betas(1),3),',',... + num2str(cur_stats.se(1)),',',... + num2str(cur_stats.p(1))]); +disp(['TX: (',... + num2str(cur_betas(2),3),',',... + num2str(cur_stats.se(2)),',',... + num2str(cur_stats.p(2))]); + +v30_tx_llhd=cur_logl; + +%v30_llhd = -322.65; %v30 +v30_llhd = -317.87; %v30 +tx_llr_test = -2*(v30_llhd)-(-2*cur_logl); +tx_llr_pval = 1-chi2cdf(tx_llr_test,1); +disp(['Tx LLRatio p-value: ',num2str(tx_llr_pval,3)]); + +tx_llhd = -329.76; %v30 +v30_llr_test = -2*(tx_llhd)-(-2*cur_logl); +v30_llr_pval = 1-chi2cdf(v30_llr_test,1); +disp(['V30 LLRatio p-value: ',num2str(v30_llr_pval,3)]); +disp(['LLHD: ',num2str(cur_logl,4)]); +disp(['AIC: ',num2str(2*2-2*cur_logl,5)]); + + + +%% V30 + cm2cw CPH +[cm2cwCox,~,~] = CGobj.fCoxParameter_DVH('cm2cw'); +cm2cw_data = [cm2cwCox.data_exposure]; + + +[cur_betas,cur_logl,~,cur_stats]=... + coxphfit([v30_data cm2cw_data],compdate,'baseline',0,'censoring',flgcensor); +disp([10]); +disp('V30 + cm2cw'); +disp('(beta,se,p-val)'); +disp(['v30: (',... + num2str(cur_betas(1),3),',',... + num2str(cur_stats.se(1)),',',... + num2str(cur_stats.p(1))]); +disp(['cm2cw: (',... + num2str(cur_betas(2),3),',',... + num2str(cur_stats.se(2)),',',... + num2str(cur_stats.p(2))]); + +cm2cw_llr_test = -2*(v30_llhd)-(-2*cur_logl); +cm2cw_llr_pval = 1-chi2cdf(cm2cw_llr_test,1); +disp(['cm2cw LLRatio p-value: ',num2str(cm2cw_llr_pval,3)]); + +cm2cw_llhd = -330.17; %v30 +v30_llr_test = -2*(cm2cw_llhd)-(-2*cur_logl); +v30_llr_pval = 1-chi2cdf(v30_llr_test,1); +disp(['V30 LLRatio p-value: ',num2str(v30_llr_pval,3)]); +disp(['LLHD: ',num2str(cur_logl,4)]); +disp(['AIC: ',num2str(2*2-2*cur_logl,5)]); + + +%% V30 + BMI CPH +[bmiCox,~,~] = CGobj.fCoxParameter_DVH('BMI'); +bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + +[cur_betas,cur_logl,cur_h,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx)],compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); +disp([10]); +disp('V30 + bmi'); +disp('(beta,se,p-val)'); +disp(['v30: (',... + num2str(cur_betas(1),3),',',... + num2str(cur_stats.se(1)),',',... + num2str(cur_stats.p(1))]); +disp(['bmi: (',... + num2str(cur_betas(2),3),',',... + num2str(cur_stats.se(2)),',',... + num2str(cur_stats.p(2))]); + +v30_bmi_llhd=cur_logl; + +bmi_llr_test = -2*(v30_llhd)-(-2*cur_logl); +bmi_llr_pval = 1-chi2cdf(bmi_llr_test,1); +disp(['bmi LLRatio p-value: ',num2str(bmi_llr_pval,3)]); + +bmi_llhd=-335.32; +v30_llr_test = -2*(bmi_llhd)-(-2*cur_logl); +v30_llr_pval = 1-chi2cdf(v30_llr_test,1); +disp(['V30 LLRatio p-value: ',num2str(v30_llr_pval,3)]); +disp(['LLHD: ',num2str(cur_logl,4)]); +disp(['AIC: ',num2str(2*2-2*cur_logl,5)]); + + + +return; + + + + +%% BMI + Tx +[cur_betas,cur_logl,~,cur_stats]=... + coxphfit([bmi_data(bmi_idx) tx_data(bmi_idx)],compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); +disp([10]); + +disp('bmi + Tx'); +disp('(beta,se,p-val)'); +disp(['bmi: (',... + num2str(cur_betas(1),3),',',... + num2str(cur_stats.se(1)),',',... + num2str(cur_stats.p(1))]); +disp(['tx: (',... + num2str(cur_betas(2),3),',',... + num2str(cur_stats.se(2)),',',... + num2str(cur_stats.p(2))]); + +bmi_tx_llhd = cur_logl;%used for trivariate model + +%% V30 + BMI + Tx + +[cur_betas,cur_logl,~,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx) tx_data(bmi_idx)],compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); +disp([10]); +disp(['!!!!']); +disp('V30 + bmi + Tx'); +disp('(beta,se,p-val)'); +disp(['v30: (',... + num2str(cur_betas(1),3),',',... + num2str(cur_stats.se(1)),',',... + num2str(cur_stats.p(1))]); +disp(['bmi: (',... + num2str(cur_betas(2),3),',',... + num2str(cur_stats.se(2)),',',... + num2str(cur_stats.p(2))]); +disp(['Tx: (',... + num2str(cur_betas(3),3),',',... + num2str(cur_stats.se(3)),',',... + num2str(cur_stats.p(3))]); + +v30_bmi_tx_llhd= cur_logl; + + + +% v30_tx_llhd - v30_bmi_tx_llhd -> LLRD bmi +bmi_llr_test = -2*(v30_tx_llhd)-(-2*v30_bmi_tx_llhd); +bmi_llr_pval = 1-chi2cdf(bmi_llr_test,1); +disp(['BMI LLRatio p-value: ',num2str(bmi_llr_pval,3)]); + +% bmi_tx_llhd - v30_bmi_tx_llhd -> LLRD v30 +v30_llr_test = -2*(bmi_tx_llhd)-(-2*v30_bmi_tx_llhd); +v30_llr_pval = 1-chi2cdf(v30_llr_test,1); +disp(['V30 LLRatio p-value: ',num2str(v30_llr_pval,3)]); + +% v30_bmi_llhd - v30_bmi_tx_llhd -> LLRD tx +tx_llr_test = -2*(v30_bmi_llhd)-(-2*v30_bmi_tx_llhd); +tx_llr_pval = 1-chi2cdf(tx_llr_test,1); +disp(['Tx LLRatio p-value: ',num2str(tx_llr_pval,3)]); + + +disp(['LLHD: ',num2str(cur_logl,4)]); +disp(['AIC: ',num2str(2*2-2*cur_logl,5)]); + + + + +% +% cur_split = cur_betas(1)*v30_data + cur_betas(2)*cm2cw_data; +% cur_med = median(cur_split); +% +% split_low = [cur_split less comps) +% unique_cm2cw=unique(cm2cw); +% unique_cm2cw=unique_cm2cw(f_pvx) +% +% [min_pvx,idx_pvx] = min(pvx(f_pvx,5)); +% +% best_split = unique_cm2cw(idx_pvx); +% +% sa = cm2cw_mat{2}; +% sa = sa{idx_pvx}; +% disp(['HR(cm2cw, min p-value) = ',num2str(sa.mHR)]); + + +end \ No newline at end of file diff --git a/CWP_KMphys.m b/CWP_KMphys.m new file mode 100755 index 0000000..8089ef9 --- /dev/null +++ b/CWP_KMphys.m @@ -0,0 +1,131 @@ +function CWP_KMphys +tic; +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +fig_loc = 'Z:/elw/MATLAB/cw_analy/slides/figures/latest/'; + +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +%fn2 = ['MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat']; + +fn2 = ['MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b2.1.mat']; +%fn2 = ['MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx4_a2b2.1.mat']; + + + +load(strcat(fp,fn2),'CGobj_current'); +CGobj = {CGobj_current}; +clear CGobj_current; +CGobj = CGobj{1}; + +% Find LR, KM, and HR for given Vd and fraction size + +% select patients with data +f = CGobj.fPatientsWithComplicationData(); +CGobj = CGobj.fRemovePatient(~f); + +% survival/complication time +f2 = ~cellfun('isempty',{CGobj.mGrp.mDateComp}); % patients with no complication date +f3 = ~cellfun('isempty',{CGobj.mGrp.mDateLastFollowup}); % patients with no last follow up date + +compdate = inf(CGobj.mNumInGrp,1); +lastfollowup = inf(CGobj.mNumInGrp,1); +compdate(f2) = ([CGobj.mGrp(f2).mDateComp] - [CGobj.mGrp(f2).mDateBaseline])' / 30; +lastfollowup(f3) = ([CGobj.mGrp(f3).mDateLastFollowup] - [CGobj.mGrp(f3).mDateBaseline])' / 30; +compdate = min( lastfollowup, compdate ); +flgcensor = [CGobj.mGrp.mFlgCensor]'; + + +numFx = [3 4 5]; +%doses = [32 36 40]; %from V99 a2b=2.1 +%numFx =[4]; +doses = [99 99 99]; %from V99 a2b=2.1 +%doses = [99]; %from V99 a2b=2.1 +phys_doses = [32 36 40]; + +grp =[CGobj.mGrp]; +fxs = [grp.mFxNum]; + +for i=1:length(numFx) + cur_fxs = fxs==numFx(i); + cur_grp = grp(cur_fxs); + + cur_compdate = compdate(cur_fxs); + cur_flgcensor = flgcensor(cur_fxs); +% + cur_dose = doses(i); + [~,fdose_val] = min(abs(CGobj.mBinsDose - cur_dose)); + vds=zeros(length(cur_grp),1); % volume v at dose d + vds(:)=0; + for k=1:length(cur_grp) + vds(k) = cur_grp(k).fVolAtDose( CGobj.mBinsDose(fdose_val) ); + end + + sa = classKaplanMeierCurve(); + sa.mpValue = inf; + sa.mHR = 0; + + [~,fvol] = min(abs(vds - 31.6)); +% + flg_volbelow = vdslength(vds)-2, + continue; + end + + % Cox HR for split + cox_beta=coxphfit(~flg_volbelow,cur_compdate,'baseline',0,'censoring',cur_flgcensor); + cox_hr = exp(cox_beta); + +% % assign properties of object sa + survivedate={cur_compdate(flg_volbelow); cur_compdate(~flg_volbelow)}; % survive time of each group + fcensor={cur_flgcensor(flg_volbelow); cur_flgcensor(~flg_volbelow)}; % censor flag for each group + sa.mSurvivalTime=survivedate; + sa.mFlgCensor=fcensor; +% % compute survival curves and compare them + sa=sa.fCalculateSurvivalCurve(); + sa=sa.fCombineSurvivalTime(); + sa=sa.fCompareSurvivalByLogrank(); + sa.mHR = cox_hr; + disp(['Nfx = ',num2str(numFx(i)),' V_{',doses(i),'}']); + disp(['HR: ',num2str(cox_hr),' p: ',num2str(sa.mpValue)]); + disp([]); + + + % plot KM curves + cur_fig=figure(i); clf reset; hold on; % grid on; + set(cur_fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + + h_km(1)=stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1},'LineWidth',2); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+','MarkerSize',12); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2}./12,1-sa.mSurvivalCurve{2},'r','LineWidth',2); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1))./12,... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+','MarkerSize',12); + ylim([0 0.8]); + + str_pval = ['$p = ',num2str(sa.mpValue,'%10.1e\n'),'$',10,... + 'HR = ',num2str(sa.mHR,3)]; + %text(38,0.25,str_pval,'FontSize',16); + text(0.25,0.75,str_pval,'FontSize',20,'interpreter','latex'); + lgnd=legend(h_km,... + ['$V_{',num2str(phys_doses(i)),'} \leq 31.6$cc'],... + ['$V_{',num2str(phys_doses(i)),'}> 31.6$cc']); + + set(lgnd,'FontSize',18); + h=legend; + set(h,'interpreter','latex'); + set(h,'Location','NorthEast'); + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Years'],'fontsize',18); + ylabel(['Probability of CW Pain'],'fontsize',18); + set(gca,'FontSize',18); + + set(cur_fig,'Color','w'); + export_fig(cur_fig,... + [fig_loc,'km_v',num2str(phys_doses(i)),'_fx',num2str(i)],'-pdf'); +end +% +% end + +end \ No newline at end of file diff --git a/CWP_Nomogram.m b/CWP_Nomogram.m new file mode 100755 index 0000000..524fb76 --- /dev/null +++ b/CWP_Nomogram.m @@ -0,0 +1,65 @@ +function CWP_Nomogram +% V99Gy_2.1 and BMI + +tic; +fig_loc = 'Z:/elw/MATLAB/cw_analy/slides/figures/latest/'; +do_print=true; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +cwp_def = 'MUTTER'; + +%a2b='Inf'; +a2b='2.1'; + +%fn = {strcat(cwp_def,'_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat')}; +fn = {[cwp_def,'_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b',a2b,'.mat']}; + + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +load(strcat(fp,fn{1}),'CGobj_current'); +CGobj = CGobj_current; +clear CGobj_current; + + + + +%% V30 + tx CPH + +[VDxCox,flgCox,flganti] = CGobj.fCoxParameter_DVH('VDx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +VDxCox = VDxCox(flgCox); + +v30_ind=31; +if isequal(a2b,'2.1') + v30_ind=100; +end + +compdate = [VDxCox(v30_ind).data_hazard]; +v30_data = [VDxCox(v30_ind).data_exposure]; +flgcensor = [CGobj.mGrp.mFlgCensor]'; + + +%% V30 + BMI CPH +[bmiCox,~,~] = CGobj.fCoxParameter_DVH('BMI'); +bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + +[cur_betas,cur_logl,cur_h,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx)],compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + +%% Nomogram! +[~,hzrd_2yr_ind] = min(abs(cur_h(:,1)-24)); +hzrd_2yr = cur_h(hzrd_2yr_ind,2); + +v30_beta = cur_betas(1); +bmi_beta = cur_betas(2); + +cox_pr = (hzrd_2yr*exp(v30_beta*v30_data(bmi_idx)+bmi_beta*bmi_data(bmi_idx))); +cox_pr = cox_pr./(1+cox_pr); + + + + +end \ No newline at end of file diff --git a/CWP_OS.m b/CWP_OS.m new file mode 100755 index 0000000..33dd2f7 --- /dev/null +++ b/CWP_OS.m @@ -0,0 +1,8 @@ +function CWP_OS + + + + + +end + diff --git a/CWPainAnalysis_bad.m b/CWPainAnalysis_bad.m new file mode 100755 index 0000000..0758e37 --- /dev/null +++ b/CWPainAnalysis_bad.m @@ -0,0 +1,229 @@ +function CWPainAnalysis +tic; +% parameters + %dvhdef={'2cmExp';'Colorado'}; + dvhdef={'DVHs'}; + fxnum={-1}; % -1 all fractions, [n1 n2 ...] analyze patients with fractions of n1, n2, ... treatment planning only + beta2alpha=[0]; + + flglog = false; + if flglog + dosestep=0.05; % dose step in Gy + else + dosestep=1; + end + volstep=1; % volume step in cc + timestep=3; % time step in month + +% patient info. + % load patient info stored in the spread sheet + fn='Z:\elw\MATLAB\original_data\CW\ELW_CWPAIN_DATASET_FINAL'; + + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + try + load(fn,'xlsraw'); + catch + fn1 = strrep(fn,'tom','meta'); + [~,~,xlsraw]=xlsread([fn1,'.xlsx'],'sheet1'); + save(fn,'xlsraw'); + end + + % pick up related data + PtInfo = classDataFromXls(); + PtInfo.xlsRaw = xlsraw; + % MRN + PtInfo.ColName = 'Patient Last Name'; + PtInfo = PtInfo.ExtractColData(); + flgptcode = PtInfo.flgDataRows; + ptcode = PtInfo.ColData; + % Number of Fractions + PtInfo.ColName = 'Number of Fractions'; + PtInfo = PtInfo.ExtractColData(); + flgfx = PtInfo.flgDataRows; + fx = zeros(size(flgfx)); + fx(flgfx) = cell2mat(PtInfo.ColData(flgfx)); + % Date of Birth + PtInfo.ColName = 'Date of Birth'; + PtInfo = PtInfo.ExtractColData(); + flgdatebirth = PtInfo.flgDataRows; + datebirth = zeros(size(flgdatebirth)); + f = PtInfo.ColData(flgdatebirth); + datebirth(flgdatebirth) = datenum(f); + % IGRT Start Date + PtInfo.ColName = 'IGRT Start Date'; + PtInfo = PtInfo.ExtractColData(); + flgdateIGRT = PtInfo.flgDataRows; + dateIGRT = zeros(size(flgdateIGRT)); + f = PtInfo.ColData(flgdateIGRT); + dateIGRT(flgdateIGRT) = datenum(f); + % Last Follow Up Date + PtInfo.ColName = 'Surv Date'; + PtInfo = PtInfo.ExtractColData(); + flgdatefu = PtInfo.flgDataRows; + datefu = zeros(size(flgdatefu)); + datefu(flgdatefu) = datenum(PtInfo.ColData(flgdatefu)); + % complication grade 3 + PtInfo.ColName = 'Pain Grade 3'; + PtInfo = PtInfo.ExtractColData(); + datepain = inf(size(PtInfo.ColData)); + flgcensor = true(size(datefu)); + f = PtInfo.flgDataRows; + datepain(f) = datenum(PtInfo.ColData(f)); + flgcensor(f) = false; + % complication grade 2 + PtInfo.ColName = 'Pain Grade 2'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + datepain(f) = datenum(PtInfo.ColData(f)); + flgcensor(f) = false; + % relapse date + PtInfo.ColName = 'Local Failure'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + flgfailure = false(size(f)); + flgfailure(f) = cell2mat(PtInfo.ColData(f)); + PtInfo.ColName = 'Local Failure Date'; + PtInfo = PtInfo.ExtractColData(); + flgrelapse = PtInfo.flgDataRows; + datefailure = inf(size(flgrelapse)); + datefailure(flgrelapse&flgfailure) = datenum(PtInfo.ColData(flgrelapse&flgfailure)); + flgrelapse = flgrelapse&f; + % gender + PtInfo.ColName = 'Sex'; + PtInfo = PtInfo.ExtractColData(); + flggender = PtInfo.flgDataRows; + ptgender = PtInfo.ColData; + % death date + PtInfo.ColName = 'Surv alive 0, dead 1'; + PtInfo = PtInfo.ExtractColData(); + f1 = PtInfo.flgDataRows; + flgdeath = false(size(f1)); + flgdeath(f1) = cell2mat(PtInfo.ColData(f1)); + PtInfo.ColName = 'death Date'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + datedeath = inf(size(f)); + datedeath(f&flgdeath) = datenum(PtInfo.ColData(f&flgdeath)); + flgdeath = f1&f; + + % common part of those data + flg = flgptcode & flgfx & flgdatebirth & flgdateIGRT & flgdatefu & flgrelapse & flggender & flgdeath; + ptcode=ptcode(flg); + fx=fx(flg); + datebirth=datebirth(flg); + dateIGRT=dateIGRT(flg); + datefu=datefu(flg); + datepain=datepain(flg); + flgcensor=flgcensor(flg); + datefailure = datefailure(flg); + ptgender = ptgender(flg); + datedeath = datedeath(flg); + + % patient DVH and objects + CGobj_org=classComplicationGroup(); + CGobj_org.DoseStep_DVH = dosestep; + CGobj_org.VolStep_DVH = volstep; + CGobj_org.TimeStep_DVH = timestep; + + for m=1:length(dvhdef) % iterate with each definition + % load dvh info + fn=['Z:\elw\MATLAB\cw_analy\meta_data\CW_',dvhdef{m}]; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + load(fn,'DVH'); + + % match patients DVH and .xls + [f1,g1]=ismember(ptcode,DVH(:,1)); + [f2,g2]=ismember(DVH(:,1),ptcode); + if length(unique(g2(g2~=0)))~=length(find(g2))% || length(unique(g2~=0))~=length(find(g2)) + error('The patient ids are not unique'); + end + if ~( all(f1) && all(f2) ) + disp('The patients in the spread sheet do not match with those in DVH curves, take the common part'); + % use common part only + DVH=DVH(f2,:); + ptcode=ptcode(f1); fx=fx(f1); datebirth=datebirth(f1); dateIGRT=dateIGRT(f1); datefu=datefu(f1); datepain=datepain(f1); flgcensor=flgcensor(f1); + [~,g1]=ismember(ptcode,DVH(:,1)); + end + + % combine info from DVH and .xls to form complicationgroup object + CIobjs = classComplicationIndividual(); + CIobjs = repmat(CIobjs,[size(DVH,1),1]); + for n = 1:size(DVH,1) + CIobjs(n,1).PatientID=ptcode{n}; + CIobjs(n,1).DoseBins_org=DVH{g1(n),2}(:,1); + CIobjs(n,1).VolDiff=DVH{g1(n),2}(:,2); + CIobjs(n,1).VolCum=DVH{g1(n),2}(:,3); + CIobjs(n,1).FxNum=fx(n); + %elw + %CIobjs(n,1).DoseStep = dosestep; + %CIobjs(n,1).VolStep = volstep; + CIobjs(n,1).BirthDate = datebirth(n); + CIobjs(n,1).BaselineDate = dateIGRT(n); + CIobjs(n,1).CompOccurDate = datepain(n); + CIobjs(n,1).LastFollowupDate = datefu(n); + CIobjs(n,1).flgCensor = flgcensor(n); + CIobjs(n,1).RelapseDate = datefailure(n); + CIobjs(n,1).Gender = ptgender(n); + CIobjs(n,1).DeathDate = datedeath(n); + end + if any([CIobjs.FxNum]==0) + error('Fraction number is zeros'); + end + CGobj_org = CGobj_org.AddPatient(CIobjs); + + % per fraction category + for n=1:length(fxnum) + % pick up patient with the wanted fraction numbers + if any(fxnum{n}==-1) + f1=true(CGobj_org.numGrp,1); + else % retrieve patients with exact fractions only + f1=arrayfun(@(x) any(x==fxnum{n}),{CGobj_org.ptGrp.FxNum}); + end + CGobj_current = CGobj_org; + CGobj_current.ptGrp = CGobj_current.ptGrp(f1); + CGobj_current.numGrp = size(CGobj_current.ptGrp,1); + + % for each alpha/beta compute a series of complication table + for u = 1:length(beta2alpha) + % adjust beta to alpha ratio + CGobj_current.Beta2Alpha = beta2alpha(u); + CGobj_current = CGobj_current.LinearQuartraticCorrection(); + + % atlas + if flglog + CGobj_current = CGobj_current.CalculateDoseBinsLog_DVH(); + else + CGobj_current = CGobj_current.CalculateDoseBins_DVH(); + end + CGobj_current = CGobj_current.CalculateVolBins_DVH(); + CGobj_current = CGobj_current.CalculateTimeBins_DVH(); + + CGobj_current = CGobj_current.SurvivalCurves_DVH(); + CGobj_current = CGobj_current.CoxModelExact_DVH(); + CGobj_current = CGobj_current.LogRankTestDxExact_DVH(); + CGobj_current = CGobj_current.LogRankTestVxExact_DVH(); + CGobj_current = CGobj_current.LogRankTestDVxExact_DVH(); + CGobj_current = CGobj_current.ComplicationCurves_DVH(); +% CGobj_current = CGobj_current.CrudeAtlasAlongTime_DVH(); % crude atlas +% CGobj_current = CGobj_current.ActuaryAtlasAlongTime_DVH(); % survival maps + + % save result + CGstrct = ObjToStruct(CGobj_current); + if flglog + fn=['Z:\elw\MATLAB\cw_analy\tbd\CW_Cox_DiVj_',dvhdef{m},'_fx',num2str(fxnum{n}(1)),'_log_ratio',num2str(beta2alpha(u)),'.mat']; + else + fn=['Z:\elw\MATLAB\cw_analy\tbd\CW_Cox_DiVj_',dvhdef{m},'_fx',num2str(fxnum{n}(1)),'_ratio',num2str(beta2alpha(u)),'.mat']; + end + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + save(fn,'CGobj_current','CGstrct'); + disp(fn); + end + end + end +toc; \ No newline at end of file diff --git a/ChestWallCoxFitDisplay.m b/ChestWallCoxFitDisplay.m new file mode 100755 index 0000000..a20308e --- /dev/null +++ b/ChestWallCoxFitDisplay.m @@ -0,0 +1,94 @@ +function ChestWallCoxFitDisplay +tic; + +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\Desktop\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +%fn = {'MUTTER_MASTER_VDx_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'}; +%fn = {'MUTTER_MASTER_VDx_ChestWall_Cox_DiVj_DVHs_fx-1_a2b3.mat'}; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +CGobj = cell(length(fn),1); + +% load data +for m = 1:length(fn) + load(strcat(fp,fn{m}),'CGobj_current'); + CGobj{m} = CGobj_current; +end + + +for m = 1:length(fn) + OCobj=CGobj{m}; + [allCox,flgCox,flganti] = OCobj.fCoxParameter_DVH('VDx'); % find availabe Cox models + flgCox(flganti)=false; % anti-correlations were not be considered + logl = [allCox.logl]'; logl(~flgCox) = -inf; % log likelihood of Cox model, anti-correlation points not counted + [~,doseloc]=max(logl); % the best fitting of Cox model + allCox = allCox(doseloc); + disp(['Best Cox Model is at dose :',num2str(OCobj.mBinsDose(doseloc))]); +disp(allCox); + + % Get Vx at best dose + % volumes of patients at best Vx + Vx=zeros(OCobj.mNumInGrp,1); + d = OCobj.mBinsDose(doseloc); + for k=1:OCobj.mNumInGrp + Vx(k) = OCobj.mGrp(k).fVolAtDose( d ); + end + + hzrd_fn = allCox.h; + + %adjust duplicate values of t + f = find(diff(hzrd_fn(:,1))==0); % find duplicate time values of h(t) + while ~isempty(f) + hzrd_fn(f,1) = hzrd_fn(f,1)-eps*10; % adjust it a bit to avoid ambiguius + f = find(diff(hzrd_fn(:,1))==0); % find duplicate time values of h(t) + end + + + cox_t = hzrd_fn(:,1); + cox_h = hzrd_fn(:,2); + + % survival curve from Cox model at volume vol + km_t = OCobj.mKaplanMeierCompOverall.mSurvivalTimeSorted{1}; + cens_idx=OCobj.mKaplanMeierCompOverall.mCensorStatistics{1}(:,1); + km_t(cens_idx) = []; %remove censored times, left with comp times + + % km_t 47x1 because from complication frequency table (means 47 unique + % comp times? see mSurvialTimeTable in KaplanMeier + cox_comp_h = interp1(cox_t,cox_h,km_t,'linear','extrap'); + + + S0 = exp(-cox_comp_h); + cox_s = S0.^(exp(allCox.beta*mean(Vx))); + + % expbetax = exp(CoxPar.beta*vol); + %CoxComplicationCurve = exp( -h * expbetax ); + + %% KM curve + + % complication incidence curve +disp('Complication incidence curves'); +m = 1; +figure(m); clf reset; hold on; % grid on; +sa = OCobj.mKaplanMeierCompOverall; +stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + +% stairs(km_t,1-sa.mSurvivalCurve{1}); +% plot(km_t(sa.mCensorStatistics{1}(:,1)),... +% 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + +plot(km_t,1-cox_s,'r--'); +% xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +set(gca,'xminortick','on','yminortick','on'); +xlabel(['Months']); +ylabel(['Probability of grade >= 2 Chestwall Pain']); + + + +end + diff --git a/ChestWallDistanceToChestWallDisplay.m b/ChestWallDistanceToChestWallDisplay.m new file mode 100755 index 0000000..e385ae3 --- /dev/null +++ b/ChestWallDistanceToChestWallDisplay.m @@ -0,0 +1,144 @@ +function ChestWallDistanceToChestWallDisplay +tic; +% prepare +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +%fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'}; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf_b200.mat'}; +CGobj = cell(length(fn),1); +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; +%ss_four2three = [screen_size(3)/4 screen_size(4)/4 screen_size(3)*(3/8) screen_size(4)/2]; +% load data +for m = 1:length(fn) + load(strcat(fp,fn{m}),'CGobj_current'); + CGobj{m} = CGobj_current; +end + +for m = 1:length(fn) + + CG = CGobj{m}; + + flgcensor = [CG.mGrp.mFlgCensor]'; + cm2cw = [CG.mGrp.mDistanceToChestWall]'; + + comp_cm2cw_avg = mean(cm2cw(~flgcensor)); + cens_cm2cw_avg = mean(cm2cw(flgcensor)); + + [n1, xout1]=hist(cm2cw(~flgcensor),[0:1:6]); + [n2, xout2]=hist(cm2cw(flgcensor),[0:1:6]); + + f(1)=figure(1);clf reset; + set(gcf,'Position',ss_four2three); + hold on; + h(1)=plot(xout1,n1./sum(n1),'-ro','LineWidth',2); + h(2)=plot([comp_cm2cw_avg comp_cm2cw_avg],ylim,'--r','LineWidth',2); + h(3)=plot(xout2,n2./sum(n2),'-bo','LineWidth',2); + h(4)=plot([cens_cm2cw_avg cens_cm2cw_avg],ylim,'--b','LineWidth',2); + ylabel('Fraction of Patients','FontSize',14); + xlabel('GTV closest distance to Chest Wall [cm]','FontSize',14); + hold off; + grid on; + h_cm2cw_lgnd = legend(h,'\geq 2 Grade CW Pain',... + sprintf('Mean: %0.3f cc',comp_cm2cw_avg),... + '< 2 Grade CW Pain',... + sprintf('Mean: %0.3f cc',cens_cm2cw_avg)); + set(h_cm2cw_lgnd,'FontSize',14'); + + %% Log-Rank p-value map + f = cellfun(@(x) strcmpi('CM2CW',x),CGobj{m}.mLogRank(:,1)); + CM2CWmat = CG.mLogRank{f,2};% + pvx = CM2CWmat{1}; + f = pvx(:,6)== 1;% negative correlation (further tumor from cw -> less comps) + unique_cm2cw=unique(cm2cw); + unique_cm2cw=unique_cm2cw(f); + + f(2)=figure(2); clf reset; + set(gcf,'Position',ss_four2three); + [min_pvx,idx_pvx] = min(pvx(f,5)); + + [~, cm_idx] = min(abs(unique_cm2cw-1)); % index for 1cm split + tmp_pvx = pvx(f,5); + cm_pval = tmp_pvx(cm_idx); + + semilogy(unique_cm2cw,pvx(f,5),'-','LineWidth',2); hold on; + x_cm2cw =[0:.1:max(unique_cm2cw)]; + semilogy(x_cm2cw,repmat(0.05,length(x_cm2cw),1),'r--','LineWidth',1); + semilogy([unique_cm2cw(idx_pvx) unique_cm2cw(idx_pvx)],ylim,'g--','LineWidth',1); + hold off; % grid on; + xlim([0 max(unique_cm2cw)]); + xlabel('GTV distance to Chest Wall [cm]','fontsize',14); + ylabel('p-value','fontsize',14); + title(strcat('Log-Rank p-values for GTV distance to chest wall'),'fontsize',14); + str_text{1} = strcat('Min. Log-Rank p-value: ',... + num2str(min_pvx,' %3.2e')); + str_text{2} = strcat('at distance = ',... + num2str(unique_cm2cw(idx_pvx)),' cm'); + + text(2.25,0.001,str_text,'FontSize',14); + + %% KM curves for minimum p-value + best_split = unique_cm2cw(idx_pvx); + sa = CM2CWmat{2}; + sa = sa{idx_pvx}; + disp(['HR(cm2cw, min p-value) = ',num2str(sa.mHR)]); + + f(3)=figure(3); clf reset; hold on; % grid on; + set(gcf,'Position',ss_four2three) + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1},'r'); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'r+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'b'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'b+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + text(40,0.3,['Log-Rank p-value: ',num2str(min_pvx,'%3.2e')],'FontSize',14); + + lgnd=legend(h_km,... + strcat('Distance GTV to CW $\leq',num2str(best_split,4),'$~cm'),... + strcat('Distance GTV to CW $>',num2str(best_split,4),'$~cm'),'Location','East'); + set(lgnd,'interpreter','latex'); + set(lgnd,'FontSize',14); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title(['GTV distance to chest wall, split at ',... + num2str(best_split,3),' cm'],'fontsize',14); + + %% KM curves for split at 1cm + %% KM curves for minimum p-value + + best_split = unique_cm2cw(cm_idx); + sa = CM2CWmat{2}; + sa = sa{cm_idx}; + disp(['HR(cm2cw, 1cm) = ',num2str(sa.mHR)]); + + f(4)=figure(4); clf reset; hold on; % grid on; + set(gcf,'Position',ss_four2three) + h_km(1)=stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1},'r'); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'r+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2}./12,1-sa.mSurvivalCurve{2},'b'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1))./12,... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'b+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + + ylim([0 0.65]); + textbp(['Log-Rank p-value: ',num2str(cm_pval,'%3.2e'),10,... + 'HR = ',num2str(sa.mHR,3)],'FontSize',16); + + lgnd=legend(h_km,... + strcat('Distance GTV to CW $\leq 1$~cm'),... + strcat('Distance GTV to CW $> 1$~cm'),'Location','Best'); + set(lgnd,'interpreter','latex'); + set(lgnd,'FontSize',18); + + set(gca,'xminortick','on','yminortick','on'); + set(gca,'fontsize',18); + xlabel(['Years'],'fontsize',20); + ylabel(['Probability of CW Pain'],'fontsize',20); + title(['GTV distance to chest wall, split at 1 cm'],'fontsize',20); + +end \ No newline at end of file diff --git a/ChestWallIsoEffect.m b/ChestWallIsoEffect.m new file mode 100755 index 0000000..9ae412a --- /dev/null +++ b/ChestWallIsoEffect.m @@ -0,0 +1,76 @@ +function ChestWallIsoEffect +tic; +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +%fn = {'RIMNER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +CGobj = cell(length(fn),1); +screen_size=get(0,'ScreenSize'); + +%scrsz = get(0,'ScreenSize'); +%set(0,'DefaultFigurePosition',[scrsz(1)+scrsz(1)/4 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]); + +% load data +for m = 1:length(fn) + load(strcat(fp,fn{m}),'CGobj_current'); + CGobj{m} = CGobj_current; +end + +for m = 1:length(fn) + + CG = CGobj{m}; + CGgrp = CG.mGrp; + %% Find TD50 for each fractionation + + fractions = unique([CGgrp.mFxNum]); + num_unique_fractions = length(fractions); + + td50s = inf(num_unique_fractions,1); + + td_threshold = 0.1; + %% for each fraction size, find TD50 + for i=1:num_unique_fractions + + cur_frac = fractions(i); + + cur_grp = [CGgrp([CGgrp.mFxNum]==cur_frac)]; + + if length(cur_grp)<=1 + continue; + end + + pttotal = ones(length(cur_grp),1); + ptcomp = ones(length(cur_grp),1); + ptcomp([cur_grp.mFlgCensor])=0; + doses = [cur_grp.mDoseTx]./100; + + [b,~,st]=glmfit(doses,[ptcomp pttotal],'binomial','link','logit'); + + if b(2)<0 + continue; + end + rp_doses = [0:max(doses)]; + rpb = zeros(length(rp_doses),1); + + dose_range = 1; + while max(rpb)= 2 Chestwall Pain','fontsize',18); +legend(g,'Pre V_{30} (181)','Post V_{30} (135)','All (316)','Location','SouthEast'); +% median incident time +disp(['Log-rank p-value for V_{30} constraint: ',num2str(pre_post_pval,4)]); + + +%% Overall incidence +f3=figure(3);clf reset;hold on; +set(f3,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +sa = CGobj{3}.mKaplanMeierCompOverall; +stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1},km_colors{3}); +h_all=plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),... + strcat(km_colors{3},'+')); +ylim([0 0.65]); + +%text(54,0.085,strcat('Log-rank p-value = ',num2str(pre_post_pval,3)),... + %'FontSize',12); +set(gca,'xminortick','on','yminortick','on'); +set(gca,'FontSize',16); +xlabel('Years','fontsize',20); +ylabel('Incidence of grade \geq 2 Chestwall Pain','fontsize',20); +%grid on; +%set(gca,'GridLineStyle','--') +%legend(g,'Pre V_{30} (181)','Post V_{30} (135)','All (316)','Location','SouthEast'); +% median incident time +%disp(['Log-rank p-value for V_{30} constraint: ',num2str(pre_post_pval,4)]); + + +end diff --git a/ChestWallLogRankDisplay.m b/ChestWallLogRankDisplay.m new file mode 100755 index 0000000..49a0d22 --- /dev/null +++ b/ChestWallLogRankDisplay.m @@ -0,0 +1,1217 @@ +function ChestWallLogRankDisplay +tic; +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +%fn = {'RIMNER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +CGobj = cell(length(fn),1); +screen_size=get(0,'ScreenSize'); + +%scrsz = get(0,'ScreenSize'); +%set(0,'DefaultFigurePosition',[scrsz(1)+scrsz(1)/4 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]); + +% load data +for m = 1:length(fn) + load(strcat(fp,fn{m}),'CGobj_current'); + CGobj{m} = CGobj_current; +end + +for m = 1:length(fn) + + + + + %% Log-Rank p-value map + + + % Vx + f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); + + pvx = CGobj{m}.mLogRank{f,2};% vmax + f1 = pvx(:,:,6)== 0; + f2 = pvx(:,:,5)<=0.05; + pvx = pvx(:,:,5); + pvx(~f1)=NaN;% Remove p-vals for which correlation not calc (unnecessary bc pval=1 otherwise) + pvx(~f2)=NaN; + + fig_ctr=1; + figure(fig_ctr);clf reset; + fig_ctr=fig_ctr+1; + % hack for better printing + %gl = opengl('data') + %opengl('software') + + h=imagesc(pvx'); + set(gca, 'ActivePositionProperty','OuterPosition'); + set(h,'alphadata',~isnan(pvx')); + set(gca,'YDir','normal'); + + + xlim([0,60]); + ylim([0,800]); + colorbar; + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + set(gca,'xminortick','on','yminortick','on'); + + xlabel('Dose [Gy]','fontsize',14); + ylabel('Volume [cc]','fontsize',14); + title('Significant Log-Rank p-values for Vx','fontsize',14); + + + % VDx + dose=39; + + % + % Vx=zeros(length(CGobj{m}.mBinsDose),CGobj{m}.mNumInGrp,1); + % for d=1:length(CGobj{m}.mBinsDose), + % for k=1:CGobj{m}.mNumInGrp + % Vx(d,k) = CGobj{m}.mGrp(k).fVolAtDose( d ); + % end + % end + % + + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + % change to VDx after re-run, doesn't matter which one, all have same + % info! + f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2};% vmax + pvx = squeeze(pvx(fdose,:,:)); % look at volumes V_{fdose}, then pvx = [V_{fdose} bins]X[n1,c1,n2,c2,p,flg] + f = pvx(:,6) == 0; + + % find minimum p-value and corresponding + % volume split value in 2-3rd quartile range + v39_pvals = pvx(f,5); + v39_vols = CGobj{m}.mBinsVol(f); + + [sorted_v39_pvals,idx_sorted_pvals] = sort(pvx(f,5)); + sorted_v39_vols = v39_vols(idx_sorted_pvals); + + mid_quart_pvals =... + sorted_v39_pvals(find([sorted_v39_vols>quantile(sorted_v39_vols,0.25)].*[sorted_v39_vols1 + mid_qrt_best_split = mid_qrt_best_split(1); + end + disp(['Best split v39 volume for 2-3rd quantiles: ',num2str(v39_vols(mid_qrt_best_split)),10,... + ' with pval: ',num2str(min_mid_qrt_pval)]); + + + + %med_v39 = median(vx); + figure(fig_ctr); clf reset; + fig_ctr=fig_ctr+1; + %[ax,~,~]=plotyy(CGobj{m}.mBinsVol(f),pvx(f,5),CGobj{m}.mBinsVol(f),pvx(f,7),@semilogy) + semilogy(CGobj{m}.mBinsVol(f),pvx(f,5),'-','LineWidth',2); hold on; + semilogy(CGobj{m}.mBinsVol(f),0.05,'r-','LineWidth',1); + hold off; % grid on; + xlabel('Volume (cc)','fontsize',14); + ylabel('p-value','fontsize',14); + title(strcat('Log-Rank p-values for V_{',num2str(dose),'} values'),'fontsize',12); + [min_pvx,idx_pvx] = min(pvx(f,5)); + disp(['Minimum Log-Rank p-value is ',... + num2str(min_pvx),... + ', at V_{',num2str(dose),'} = ',... + num2str(CGobj{m}.mBinsVol(idx_pvx))]); + + + f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2};% vmax + min_pvx = nan(length(CGobj{m}.mBinsDose),1); + idx_pvx = -ones(length(CGobj{m}.mBinsDose),1); + med_vols = nan(length(CGobj{m}.mBinsDose),1); + mn_vols = nan(length(CGobj{m}.mBinsDose),1); + for i=1:length(CGobj{m}.mBinsDose) + + [~,fdose] = min(abs(CGobj{m}.mBinsDose - CGobj{m}.mBinsDose(i))); + + cur_pvx = squeeze(pvx(fdose,:,:)); % look at volumes V_{fdose}, then pvx = [V_{fdose} bins]X[n1,c1,n2,c2,p,flg] + f = cur_pvx(:,6) == 0; + if sum(f)<1 + continue; + end + + Vx=zeros(CGobj{m}.mNumInGrp,1); + for k=1:CGobj{m}.mNumInGrp + Vx(k) = CGobj{m}.mGrp(k).fVolAtDose( CGobj{m}.mBinsDose(i)); + end + + + %med_vols(i) = median(CGobj{m}.mBinsVol(f)); + %mn_vols(i) = mean(CGobj{m}.mBinsVol(f)); + med_vols(i) = median(Vx); + mn_vols(i) = mean(Vx); + + cur_pvx =cur_pvx(f,5); + [min_pvx(i),idx_pvx(i)] =min(cur_pvx); + end + + figure(fig_ctr); clf reset; + fig_ctr=fig_ctr+1; + semilogy(CGobj{m}.mBinsDose,min_pvx,'-','LineWidth',2); hold on; + semilogy(CGobj{m}.mBinsDose,0.05,'r-','LineWidth',1); + set(gca,'xminortick','on','yminortick','on'); + grid on; + xlabel('Dose [Gy]','fontsize',14); + ylabel('Minimum Log-Rank p-value','fontsize',14); + title('Log-Rank p-value vs V_{D}','fontsize',12); + hold off; % grid on; + + f4=figure(fig_ctr); clf reset; + fig_ctr=fig_ctr+1; + %set(f4,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h=idx_pvx<1; + idx_pvx(h)=[]; + hold on; + j(1)=plot(CGobj{m}.mBinsDose(~h),CGobj{m}.mBinsVol(idx_pvx),'-','LineWidth',2); + j(2)=plot(CGobj{m}.mBinsDose(~h),med_vols(~h),'r--','LineWidth',1); + j(3)=plot(CGobj{m}.mBinsDose(~h),mn_vols(~h),'g--','LineWidth',1); + hold off; + + set(gca,'xminortick','on','yminortick','on'); + grid on; + legend(j,'Best V_{D}','Median V_{D}','Mean V_{D}'); + xlabel('Dose [Gy]','fontsize',14); + ylabel('Volume of best Log-Rank split [cc]','fontsize',14); + title('Log-Rank Volume split vs V_{D}','fontsize',12); + hold off; % grid on; + + %% KM curve displays + + % compose complication KM curves + + sa=classKaplanMeierCurve(); % initialize a survivalanalysis obj + sa2=classKaplanMeierCurve(); % initialize a survivalanalysis obj + CG = CGobj{m}; + % survival/complication time + f2 = ~cellfun('isempty',{CG.mGrp.mDateComp}); % patients with no complication date + f3 = ~cellfun('isempty',{CG.mGrp.mDateLastFollowup}); % patients with no last follow up date + compdate = inf(CG.mNumInGrp,1); + lastfollowup = inf(CG.mNumInGrp,1); + compdate(f2) = ([CG.mGrp(f2).mDateComp] - [CG.mGrp(f2).mDateBaseline])' / 30; + lastfollowup(f3) = ([CG.mGrp(f3).mDateLastFollowup] - [CG.mGrp(f3).mDateBaseline])' / 30; + compdate = min( lastfollowup, compdate ); + flgcensor = [CG.mGrp.mFlgCensor]'; + + + + % V39 + %median split + dose=39; + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + pvx = squeeze(pvx(fdose,:,:)); + f = pvx(:,6) < 2; + + + vd=zeros(CG.mNumInGrp,1); % volume v at dose d + numstart=CG.mLogRankMinSize; + for d=fdose:fdose + % volume under d + vd(:)=0; + for k=1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); + end + g=find(vd>-1); % non-zeros volume cases + + % median volume + vol = median(vd); + %vol = 97; + [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); + disp(['Median value of V_{',num2str(dose),'} = ',num2str(vol)]); + disp(['Log-Rank p-value of V_{',num2str(dose),... + '} split at ',num2str(vol),... + ' = ',num2str(pvx(fvol,5))]); + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(fvol,5),'%10.2e\n'))}; + + % (di,vj) + numend=length(g)-numstart; + for v=fvol:fvol + % check smaple size + flg_volbelow1=vd(g)<=CG.mBinsVol(v); f=length(find(flg_volbelow1)); % group DVHs by (d,v) + if fnumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + % assign properties of object sa + survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group + fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group + sa.mSurvivalTime=survivedate; + sa.mFlgCensor=fcensor; + % compute survival curves and compare them + sa=sa.fCalculateSurvivalCurve(); + sa=sa.fCombineSurvivalTime(); + sa=sa.fCompareSurvivalByLogrank(); + end + end + + % plot KM curves + figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + text(38,0.25,str_pval1,'FontSize',12); + lgnd=legend(h_km,... + strcat('V$_{39}\leq',num2str(vol,4),'$'),... + strcat('V$_{39}\geq',num2str(vol,4),'$'),'Location','Best'); + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{39}, Median split','fontsize',14); + + dose=33; + split=-1; + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + + dose=39; + split=-1; + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + + dose=39; + split=97;%best + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; +% % V33 +% %median split +% dose=33; +% [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); +% f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); +% pvx = CGobj{m}.mLogRank{f,2}; +% pvx = squeeze(pvx(fdose,:,:)); +% f = pvx(:,6) < 2; +% +% +% vd=zeros(CG.mNumInGrp,1); % volume v at dose d +% numstart=CG.mLogRankMinSize; +% for d=fdose:fdose +% % volume under d +% vd(:)=0; +% for k=1:CG.mNumInGrp +% vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); +% end +% g=find(vd>-1); % non-zeros volume cases +% +% % median volume +% vol = median(vd); +% [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); +% disp(['Median value of V_{',num2str(dose),'} = ',num2str(vol)]); +% disp(['Log-Rank p-value of V_{',num2str(dose),... +% '} split at ',num2str(vol),... +% ' = ',num2str(pvx(fvol,5))]); +% str_pval2 = {strcat('Log-Rank p-value = ',num2str(pvx(fvol,5),'%10.2e\n'))}; +% +% % (di,vj) +% numend=length(g)-numstart; +% for v=fvol:fvol +% % check smaple size +% flg_volbelow1=vd(g)<=CG.mBinsVol(v); f=length(find(flg_volbelow1)); % group DVHs by (d,v) +% if fnumend % one group has too less patients, or the volume at the dose is too small, skip it +% continue; +% end +% +% % assign properties of object sa +% survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group +% fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); +% end +% end +% +% % plot KM curves +% figure(6); clf reset; hold on; % grid on; +% h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +% plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... +% 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +% h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +% plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... +% 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); +% % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +% text(38,0.25,str_pval2,'FontSize',12); +% lgnd=legend(h_km,... +% strcat('V$_{33}\leq',num2str(vol,4),'$'),... +% strcat('V$_{33}\geq',num2str(vol,4),'$'),'Location','Best'); +% set(lgnd,'FontSize',14); +% h=legend; +% set(h,'interpreter','latex'); +% +% set(gca,'xminortick','on','yminortick','on'); +% xlabel(['Months'],'fontsize',14); +% ylabel(['Probability of CW Pain'],'fontsize',14); +% title('V_{33}, Median split','fontsize',14); +% + + % V30 + %median split + dose=30; + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + f = cellfun(@(x) strcmpi('VDx',x),CGobj{m}.mLogRank(:,1)); + cur_pvx = CGobj{m}.mLogRank{f,2}; + cur_pvx = squeeze(cur_pvx(fdose,:,:)); + f = cur_pvx(:,6) < 2; + + + f7=figure(fig_ctr); clf reset; + fig_ctr=fig_ctr+1; + + set(f7,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + x_axis = CGobj{m}.mBinsVol(f); + x_axis = x_axis(1:150); + v30_hrs = cur_pvx(f,7); + v30_hrs = v30_hrs(1:150); + v30_pvals = cur_pvx(f,5); + v30_pvals = v30_pvals(1:150); + %semilogy(CGobj{m}.mBinsVol(f),cur_pvx(f,5),'-','LineWidth',2); hold on; + [ax,h1,h2]=plotyy(x_axis,v30_hrs,x_axis,v30_pvals,@semilogy);hold on; + set(h1,'LineWidth',2); + set(h2,'LineWidth',2); + set(ax(1),'YLim',[2.5 7]); + set(ax(1),'YTick',[2.5:1:7]); + set(get(ax(1),'Ylabel'),'String','Hazard Ratio','FontSize',15); + + set(get(ax(2),'Ylabel'),'String','p-value','FontSize',15); + semilogy(x_axis,0.05,'r-','LineWidth',1); + %xlim([0 max(x_axis)]); + set(ax(1),'XLim',[0 max(x_axis)]); + set(ax(2),'XLim',[0 max(x_axis)]); + set(ax,'FontSize',14); + %line(vol,ylim); + %here + Lmed = line([med_vols(31) med_vols(31)],ylim,'Color','k','LineWidth',2); + %L30 = line([30 30],ylim,'Color','g','LineWidth',2); + %L50 = line([50 50],ylim,'Color','c','LineWidth',2); + %L70 = line([70 70],ylim,'Color','m','LineWidth',2); + hold off; % grid on; + xlabel('Volume (cc)','fontsize',15); + %ylabel('p-value','fontsize',14); + title(strcat('Log-Rank p-values for V_{',num2str(dose),'} values'),'fontsize',14); +% lgnd=legend([Lmed L30 L50 L70],['Median = ',num2str(med_vols(30))],'30cc','50cc','70cc','Location','SouthEast'); + lgnd=legend(Lmed,['Median = ',num2str(med_vols(31),4),' cc']); + set(lgnd,'FontSize',14); + +% vd=zeros(CG.mNumInGrp,1); % volume v at dose d +% numstart=CG.mLogRankMinSize; +% for d=fdose:fdose +% % volume under d +% vd(:)=0; +% for k=1:CG.mNumInGrp +% vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); +% end +% g=find(vd>-1); % non-zeros volume cases +% +% % median volume +% vol = median(vd); +% %vol = 50; +% [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); +% disp(['Median value of V_{',num2str(dose),'} = ',num2str(vol)]); +% disp(['Log-Rank p-value of V_{',num2str(dose),... +% '} split at ',num2str(vol),... +% ' = ',num2str(cur_pvx(fvol,5))]); +% str_pval2 = {strcat('Log-Rank p-value = ',num2str(cur_pvx(fvol,5),'%10.2e\n'))}; +% +% +% +% % (di,vj) +% numend=length(g)-numstart; +% for v=fvol:fvol +% % check smaple size +% flg_volbelow1=vd(g)<=CG.mBinsVol(v); f=length(find(flg_volbelow1)); % group DVHs by (d,v) +% if fnumend % one group has too less patients, or the volume at the dose is too small, skip it +% continue; +% end +% +% % assign properties of object sa +% survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group +% fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); +% end +% +% +% vol2 = 30; %cc +% [~,fvol2] = min(abs(CGobj{m}.mBinsVol - vol2)); +% disp(['Median value of V_{',num2str(dose),'} = ',num2str(vol2)]); +% disp(['Log-Rank p-value of V_{',num2str(dose),... +% '} split at ',num2str(vol2),... +% ' = ',num2str(cur_pvx(fvol2,5))]); +% str_pval3 = {strcat('Log-Rank p-value = ',num2str(cur_pvx(fvol2,5),'%10.2e\n'))}; +% +% for v=fvol2:fvol2 +% % check smaple size +% flg_volbelow1=vd(g)<=CG.mBinsVol(v); f=length(find(flg_volbelow1)); % group DVHs by (d,v) +% if fnumend % one group has too less patients, or the volume at the dose is too small, skip it +% continue; +% end +% +% % assign properties of object sa +% survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group +% fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group +% sa2.mSurvivalTime=survivedate; +% sa2.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa2=sa2.fCalculateSurvivalCurve(); +% sa2=sa2.fCombineSurvivalTime(); +% sa2=sa2.fCompareSurvivalByLogrank(); +% end +% +% +% +% end +% +% +% % plot KM curves +% % V_{30} split at median: 50cc +% f8=figure(8); clf reset; hold on; % grid on; +% set(f8,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +% h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +% plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... +% 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +% h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +% plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... +% 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); +% % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +% text(38,0.25,str_pval2,'FontSize',14); +% ylim([0 0.53]); +% lgnd=legend(h_km,... +% strcat('V$_{30}\leq',num2str(vol,4),'$~cc'),... +% strcat('V$_{30}\geq',num2str(vol,4),'$~cc'),'Location','Best'); +% set(lgnd,'FontSize',14); +% h=legend; +% set(h,'interpreter','latex'); +% +% set(gca,'xminortick','on','yminortick','on'); +% xlabel(['Months'],'fontsize',14); +% ylabel(['Probability of CW Pain'],'fontsize',14); +% title(strcat('V_{30}, Median split (',num2str(vol),' cc)'),'fontsize',14); +% +% % plot KM curves +% % V_{30} split at 30cc +% f9=figure(9); clf reset; hold on; % grid on; +% set(f9,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +% +% h_km(1)=stairs(sa2.mSurvivalTimeSorted{1},1-sa2.mSurvivalCurve{1}); +% plot(sa2.mSurvivalTimeSorted{1}(sa2.mCensorStatistics{1}(:,1)),... +% 1-sa2.mSurvivalCurve{1}(sa2.mCensorStatistics{1}(:,1)),'+'); +% h_km(2)=stairs(sa2.mSurvivalTimeSorted{2},1-sa2.mSurvivalCurve{2},'r'); +% plot(sa2.mSurvivalTimeSorted{2}(sa2.mCensorStatistics{2}(:,1)),... +% 1-sa2.mSurvivalCurve{2}(sa2.mCensorStatistics{2}(:,1)),'r+'); +% % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +% text(38,0.25,str_pval3,'FontSize',14); +% lgnd=legend(h_km,... +% strcat('V$_{30}\leq',num2str(vol2,4),'$~cc'),... +% strcat('V$_{30}\geq',num2str(vol2,4),'$~cc'),'Location','Best'); +% set(lgnd,'FontSize',14); +% h=legend; +% set(h,'interpreter','latex'); +% ylim([0 0.53]); +% set(gca,'xminortick','on','yminortick','on'); +% xlabel(['Months'],'fontsize',14); +% ylabel(['Probability of CW Pain'],'fontsize',14); +% title('V_{30}, 30cc split','fontsize',14); + + dose=30; + split=med_vols(31); + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + ylim([0 0.65]); + + dose=30; + split=50; + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + ylim([0 0.65]); + + + dose=30; + split=30; + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + ylim([0 0.53]); + + dose=30; + split=70; + fPlotKaplanMeierCurve_VDx(CGobj,dose,split); + fig_ctr=fig_ctr+1; + ylim([0 0.53]); + + + %% BMI split +% at median + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + bmi_data = bmi_data(bmi_idx); + + numstart=CG.mLogRankMinSize; + %here + + bmi_split = median(bmi_data); + + + + % (di,vj) + numend=length(bmi_data)-numstart; + + flg_volbelow1= (bmi_datanumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + % assign properties of object sa +% survivedate={compdate(flg_volbelow1); compdate(~flg_volbelow1)}; % survive time of each group +% fcensor={flgcensor(flg_volbelow1); flgcensor(~flg_volbelow1)}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); + + [~,fsplit] = min(abs(unique(bmi_data)-bmi_split)); + f = cellfun(@(x) strcmpi('BMI',x),CGobj{m}.mLogRank(:,1)); + if ~isempty(f) + pvx = CGobj{m}.mLogRank{f,2}; + + %here + sa = pvx{2}{fsplit}; + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + + + % plot KM curves + f11=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f11,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + ylim([0 0.55]); + text(38,0.12,str_pval1,'FontSize',16); + lgnd=legend(h_km,... + strcat('$\rm{BMI} <',num2str(bmi_split,4),'$'),... + strcat('$\rm{BMI} \geq',num2str(bmi_split,4),'$'),... + 'Location','Best'); + set(lgnd,'FontSize',16); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('BMI, Median split','fontsize',14); + + f = cellfun(@(x) strcmpi('BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2};% vmax + pvx = pvx{1} + %pvx = squeeze(pvx(fdose,:,:)); % look at volumes V_{fdose}, then pvx = [V_{fdose} bins]X[n1,c1,n2,c2,p,flg] + f = pvx(:,6) == 0; + f12=figure(fig_ctr); clf reset; + fig_ctr=fig_ctr+1; + set(f12,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + unique_bmi_data = unique(bmi_data); + [min_pvx,idx_pvx] = min(pvx(f,5)); + unique_bmi_data = unique_bmi_data(f); + semilogy(unique_bmi_data,pvx(f,5),'-','LineWidth',2); hold on; + semilogy([min(unique_bmi_data) max(unique_bmi_data)],[0.05 0.05],'r--','LineWidth',2); + semilogy([unique_bmi_data(idx_pvx) unique_bmi_data(idx_pvx)],ylim,'g--','LineWidth',2); + hold off; % grid on; + xlim([min(unique_bmi_data) max(unique_bmi_data)]); + xlabel('BMI','fontsize',14); + ylabel('p-value','fontsize',14); + title(strcat('Log-Rank p-values for BMI split values'),'fontsize',14); + + str_pval1 = {strcat('Log-Rank p-value = ',... + num2str(min_pvx,'%10.2e\n'),... + ' at BMI = ',... + num2str(unique_bmi_data(idx_pvx)))}; + text(15,0.001,str_pval1,'FontSize',14); + + %% BMI at min pval + best_bmi = unique_bmi_data(idx_pvx); + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + bmi_data = bmi_data(bmi_idx); + + numstart=CG.mLogRankMinSize; + %here + + bmi_split = best_bmi; + + % (di,vj) + numend=length(bmi_data)-numstart; + + flg_volbelow1= (bmi_datanumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + cox_beta=coxphfit(~flg_volbelow1,compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + cox_hr = exp(cox_beta); + disp(['HR(BMI,min p-val): ',num2str(cox_hr)]); + + % assign properties of object sa +% survivedate={compdate(flg_volbelow1); compdate(~flg_volbelow1)}; % survive time of each group +% fcensor={flgcensor(flg_volbelow1); flgcensor(~flg_volbelow1)}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); +% + [~,fsplit] = min(abs(unique(bmi_data)-bmi_split)); + f = cellfun(@(x) strcmpi('BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + % here + sa = pvx{2}{fsplit}; + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + + + % plot KM curves + f13=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f13,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + ylim([0 0.55]); + text(38,0.15,str_pval1,'FontSize',16); + lgnd=legend(h_km,... + strcat('$\rm{BMI} <',num2str(bmi_split,4),'$'),... + strcat('$\rm{BMI} \geq',num2str(bmi_split,4),'$'),... + 'Location','Best'); + set(lgnd,'FontSize',16); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('BMI, best split','fontsize',14); + + %% BMI at 29 + best_bmi = unique_bmi_data(idx_pvx); + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + bmi_data = bmi_data(bmi_idx); + + numstart=CG.mLogRankMinSize; + %here + + %bmi_split = 29; + bmi_split = 30; + + % (di,vj) + numend=length(bmi_data)-numstart; + + flg_volbelow1= (bmi_datanumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + % assign properties of object sa +% survivedate={compdate(flg_volbelow1); compdate(~flg_volbelow1)}; % survive time of each group +% fcensor={flgcensor(flg_volbelow1); flgcensor(~flg_volbelow1)}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); + + [~,fsplit] = min(abs(unique(bmi_data)-bmi_split)); + f = cellfun(@(x) strcmpi('BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + %here + sa = pvx{2}{fsplit}; + cox_beta=coxphfit(~flg_volbelow1,compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + cox_hr = exp(cox_beta); + disp(['Cox HR for BMI: ',num2str(cox_hr)]); + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + %str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + str_pval1 = ['Log-Rank p-value = ',num2str(pvx(1,5),'%3.1e\n'),10,... + 'HR = ',num2str(cox_hr,'%3.1f')]; + % plot KM curves + f14=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f14,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2}./12,1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1))./12,... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + ylim([0 0.65]); + textbp(str_pval1,'FontSize',16); + lgnd=legend(h_km,... + strcat('$\rm{BMI} <',num2str(bmi_split,4),'$'),... + strcat('$\rm{BMI} \geq',num2str(bmi_split,4),'$'),... + 'Location','Best'); + set(lgnd,'FontSize',18); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + set(gca,'fontsize',16); + xlabel(['Years'],'fontsize',20); + ylabel(['Incidence of CW Pain'],'fontsize',20); + title(['BMI, split at ',num2str(bmi_split,4)],'fontsize',20); + + %% V_{39} + BMI split + + + dose=39; + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + + vd=zeros(CG.mNumInGrp,1); % volume v at dose d + numstart=CG.mLogRankMinSize; + for d=fdose:fdose + % volume under d + vd(:)=0; + for k=1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); + end + %g=find(vd>-1); % non-zeros volume cases + g=find(bmi_idx); + + %here + vd_bmi = 0.0207.*vd(g) + 0.0408.*bmi_data(g); + vd_bmi_split = median(vd_bmi); + + + %disp(['Median value of V_{',num2str(dose),'} = ',num2str(vol)]); + %disp(['Log-Rank p-value of V_{',num2str(dose),... + % '} split at ',num2str(vol),... + % ' = ',num2str(pvx(fvol,5))]); + + + + % (di,vj) + numend=length(g)-numstart; + + flg_volbelow1= (vd_bminumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end +% +% % assign properties of object sa +% survivedate={compdate(flg_volbelow1); compdate(~flg_volbelow1)}; % survive time of each group +% fcensor={flgcensor(flg_volbelow1); flgcensor(~flg_volbelow1)}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); + + end + + [~,fsplit] = min(abs(unique(vd_bmi)-vd_bmi_split)); + f = cellfun(@(x) strcmpi('V39BMI',x),CGobj{m}.mLogRank(:,1)); + + if ~isempty(f) + pvx = CGobj{m}.mLogRank{f,2}; + + sa = pvx{2}{fsplit}; + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + end + + % plot KM curves + f10=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f10,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + text(38,0.25,str_pval1,'FontSize',16); + ylim([0 0.8]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{39}}\times V_{39}+\beta_{BMI}\times BMI <',num2str(vd_bmi_split,3),'$'),... + strcat('$\beta_{V_{39}}\times V_{39}+\beta_{BMI}\times BMI \geq',num2str(vd_bmi_split,3),'$'),... + 'Location','NorthEast'); + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{39} + BMI, Median split','fontsize',14); + end + %% V_{30} + BMI split + + + dose=30; + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + + vd=zeros(CG.mNumInGrp,1); % volume v at dose d + numstart=CG.mLogRankMinSize; + for d=fdose:fdose + % volume under d + vd(:)=0; + for k=1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); + end + %g=find(vd>-1); % non-zeros volume cases + g=find(bmi_idx); + + %here + vd_bmi = 0.0131*vd(g) + 0.0426*bmi_data(g); + vd_bmi_split = median(vd_bmi); + + numend=length(g)-numstart; + + flg_volbelow1= (vd_bminumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); + + + [~,fsplit] = min(abs(unique(vd_bmi)-vd_bmi_split)); + f = cellfun(@(x) strcmpi('V30BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + sa = pvx{2}{fsplit}; + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + end + + % plot KM curves + f16=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f16,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + %text(38,0.25,str_pval1,'FontSize',16); + textbp(str_pval1,'FontSize',16); + ylim([0 0.65]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI <',num2str(vd_bmi_split,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \geq',num2str(vd_bmi_split,3),'$'),... + 'Location','NorthEast'); + set(lgnd,'FontSize',18); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + set(gca,'fontsize',16); + xlabel(['Months'],'fontsize',20); + ylabel(['Probability of CW Pain'],'fontsize',20); + title('V_{30} + BMI, Median split','fontsize',20); + + %% V_{30} + BMI + Tx + + sa=classKaplanMeierCurve(); % initialize a survivalanalysis obj + + dose=30; + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + + [bmiCox,~,~] = CGobj{m}.fCoxParameter_DVH('BMI'); + bmi_data = [bmiCox.data_exposure]; + bmi_idx = bmi_data>0; + + [txCox,~,~] = CGobj{m}.fCoxParameter_DVH('Tx'); + tx_data = [txCox.data_exposure]; + + + vd=zeros(CG.mNumInGrp,1); % volume v at dose d + numstart=CG.mLogRankMinSize; + for d=fdose:fdose + % volume under d + vd(:)=0; + for k=1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); + end + %g=find(vd>-1); % non-zeros volume cases + g=find(bmi_idx); + + %here + vd_bmi_tx = 0.011902*vd(g) +... + 0.042235*bmi_data(g) +... + 0.000527*tx_data(g); + + vd_bmi_tx_split = median(vd_bmi_tx); + + + + + % (di,vj) + numend=length(g)-numstart; + + flg_volbelow1= (vd_bmi_txnumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + % assign properties of object sa +% survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group +% fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group +% sa.mSurvivalTime=survivedate; +% sa.mFlgCensor=fcensor; +% % compute survival curves and compare them +% sa=sa.fCalculateSurvivalCurve(); +% sa=sa.fCombineSurvivalTime(); +% sa=sa.fCompareSurvivalByLogrank(); + + + [~,fsplit] = min(abs(unique(vd_bmi_tx)-vd_bmi_tx_split)); + f = cellfun(@(x) strcmpi('V30BMITX',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + + sa = pvx{2}{fsplit}; + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(pvx(1,5),'%10.2e\n'))}; + + end + + % plot KM curves + f15=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f15,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2}./12,1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1))./12,... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + %text(38,0.25,str_pval1,'FontSize',16); + + ylim([0 0.65]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI+\beta_{Tx}\times Tx<',num2str(vd_bmi_tx_split,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI+\beta_{Tx}\times Tx \geq',num2str(vd_bmi_tx_split,3),'$'),... + 'Location','NorthEast'); + set(lgnd,'FontSize',18); + h=legend; + set(h,'interpreter','latex'); + textbp(str_pval1,'FontSize',18); + + set(gca,'xminortick','on','yminortick','on'); + set(gca,'fontsize',16); + xlabel(['Years'],'fontsize',20); + ylabel(['Probability of CW Pain'],'fontsize',20); + title('V_{30} + BMI + Tx, Median split','fontsize',20); + + + %% V30 + BMI + TX best split + f = cellfun(@(x) strcmpi('V30BMITX',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + [min_pval,min_pvx_idx] = min(pvx{1}(:,5)); + + sa = pvx{2}{min_pvx_idx}; + vd_bmi_tx = 0.011902*vd(bmi_idx) +... + 0.042235*bmi_data(bmi_idx) +... + 0.000527*tx_data(bmi_idx); + vd_bmi_tx_split = vd_bmi_tx(min_pvx_idx); + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(min_pval,'%10.2e\n'))}; + + + + % plot KM curves + f18=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f18,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2}./12,1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1))./12,... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + textbp(str_pval1,'FontSize',16); + ylim([0 0.8]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI+\beta_{Tx}\times Tx<',num2str(vd_bmi_tx_split,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI+\beta_{Tx}\times Tx \geq',num2str(vd_bmi_tx_split,3),'$'),... + 'Location','East'); + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{30} + BMI + Tx, best split','fontsize',14); + + %% V30 + BMI best split + f = cellfun(@(x) strcmpi('V30BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + [min_pval,min_pvx_idx] = min(pvx{1}(:,5)); + + sa = pvx{2}{min_pvx_idx}; + vd_bmi = 0.0131*vd(bmi_idx) + 0.0426*bmi_data(bmi_idx); + vd_bmi_split = vd_bmi(min_pvx_idx); + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(min_pval,'%10.2e\n'))}; + + + + % plot KM curves + f19=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f19,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + ylim([0 0.65]); + textbp(str_pval1,'FontSize',16); + %ylim([0 0.8]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI <',num2str(vd_bmi_split,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \geq',num2str(vd_bmi_split,3),'$'),... + 'Location','Best'); + set(lgnd,'FontSize',18); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',20); + ylabel(['Probability of CW Pain'],'fontsize',20); + title('V_{30} + BMI, best split','fontsize',20); + + %% V39 + BMI best split + f = cellfun(@(x) strcmpi('V39BMI',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + + [min_pval,min_pvx_idx] = min(pvx{1}(:,5)); + + sa = pvx{2}{min_pvx_idx}; + vd_bmi = 0.0207.*vd(bmi_idx) + 0.0408.*bmi_data(bmi_idx); + vd_bmi_split = vd_bmi(min_pvx_idx); + + pvx = pvx{1}; + pvx = squeeze(pvx(fsplit,:,:)); + f = pvx(:,6) < 2; + str_pval1 = {strcat('Log-Rank p-value = ',num2str(min_pval,'%10.2e\n'))}; + + + + % plot KM curves + f20=figure(fig_ctr); clf reset; hold on; % grid on; + fig_ctr=fig_ctr+1; + set(f20,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + text(38,0.1,str_pval1,'FontSize',16); + ylim([0 0.8]); + lgnd=legend(h_km,... + strcat('$\beta_{V_{39}}\times V_{39}+\beta_{BMI}\times BMI <',num2str(vd_bmi_split,3),'$'),... + strcat('$\beta_{V_{39}}\times V_{39}+\beta_{BMI}\times BMI \geq',num2str(vd_bmi_split,3),'$'),... + 'Location','East'); + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{39} + BMI, best split','fontsize',14); +end + + +toc; +end \ No newline at end of file diff --git a/ChestWallLogVDxBMI.m b/ChestWallLogVDxBMI.m new file mode 100755 index 0000000..d3cce52 --- /dev/null +++ b/ChestWallLogVDxBMI.m @@ -0,0 +1,566 @@ +function ChestWallLogVDxBMI +tic; +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +fn = 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b2.1.mat'; +CGobj = cell(length(fn),1); +screen_size=get(0,'ScreenSize'); + +%scrsz = get(0,'ScreenSize'); +%set(0,'DefaultFigurePosition',[scrsz(1)+scrsz(1)/4 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]); + +% load data +load(strcat(fp,fn),'CGobj_current'); +CGobj = CGobj_current; + +% select patients with data +f = CGobj.fPatientsWithComplicationData(); +CGobj = CGobj.fRemovePatient(~f); + +% survival/complication time +f2 = ~cellfun('isempty',{CGobj.mGrp.mDateComp}); % patients with no complication date +f3 = ~cellfun('isempty',{CGobj.mGrp.mDateLastFollowup}); % patients with no last follow up date +compdate = inf(CGobj.mNumInGrp,1); +lastfollowup = inf(CGobj.mNumInGrp,1); +compdate(f2) = ([CGobj.mGrp(f2).mDateComp] - [CGobj.mGrp(f2).mDateBaseline])' / 30; +lastfollowup(f3) = ([CGobj.mGrp(f3).mDateLastFollowup] - [CGobj.mGrp(f3).mDateBaseline])' / 30; +compdate = min( lastfollowup, compdate ); +flgcensor = [CGobj.mGrp.mFlgCensor]'; + +bmi = [CGobj.mGrp.mBMI]'; +bmi_idx = bmi>0; + +compdate = compdate(bmi_idx); +flgcensor = flgcensor(bmi_idx); + + + + +f = cellfun(@(x) strcmpi('VDxBMI',x),CGobj.mCoxParameter(:,1)); % search the label +VDxBMICox = CGobj.mCoxParameter{f,2}; % extract Cox model result +flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), VDxBMICox); % some fields are empty or infinite, indicating no data for those values +VDxBMICox = VDxBMICox(flgCox); +tmp_beta = {VDxBMICox.beta}; +is_inf = cellfun(@(x) length(x),tmp_beta); +is_inf = is_inf==1; +tmp_beta = tmp_beta(~is_inf); + + + +VDxBMICox = VDxBMICox(~is_inf); +betas = cell2mat(tmp_beta)'; + +sa=classKaplanMeierCurve(); + +rates = nan(length(VDxBMICox),1); +beta_vd = nan(length(VDxBMICox),1); +beta_bmi = nan(length(VDxBMICox),1); +splits = nan(length(VDxBMICox),1); +pvals = nan(length(VDxBMICox),1); +flg_split2=-1; +%for i=1:length(VDxBMICox) + +v30_idx=100; +cur_vd = VDxBMICox(v30_idx).data_exposure(:,1); +cur_vd_beta = betas(v30_idx,1); + +cur_bmi = VDxBMICox(v30_idx).data_exposure(:,2); +cur_bmi_beta = betas(v30_idx,2); + +cur_arg = [cur_vd_beta*cur_vd+cur_bmi_beta*cur_bmi]; + +unique_arg = unique(cur_arg); +median_arg = median(cur_arg); + + +rates = nan(length(unique_arg),1); +beta_vd = nan(length(unique_arg),1); +beta_bmi = nan(length(unique_arg),1); +splits = nan(length(unique_arg),1); +pvals = nan(length(unique_arg),1); +below = nan(length(unique_arg),1); +above = nan(length(unique_arg),1); + +flg_split2=-1; +numstart=2; +numend=length(unique_arg)-numstart; +for j=1:length(unique_arg) + + + split_arg = unique_arg(j); + + flg_split=cur_arg<=split_arg; + f=length(find(flg_split)); + if fnumend % one group has too few patients, skip it + continue; + end + if isequal(flg_split,flg_split2) % if it is the same grouping as previous, skip the computation and save the result directly + continue; + end + flg_split2=flg_split; + + % calculate Log-Rank p-value, if sig, continue + survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group + fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group + sa.mSurvivalTime=survivedate; + sa.mFlgCensor=fcensor; + + sa=sa.fCalculateSurvivalCurve(); + sa=sa.fCombineSurvivalTime(); + sa=sa.fCompareSurvivalByLogrank(); + + lr_pval = sa.mpValue; + if lr_pval < 0.05 && cur_vd_beta>=0 && cur_bmi_beta>=0, + + % (n1,c1,n2,c2,p,flg,sa (flg: 0 -- positive corelation, 1 -- negative corelation, 2 -- not available)) + % VDxBMImat(v,1:5)=[length(survivedate{1,1}),sum(fcensor{1,1}), length(survivedate{2,1}),sum(fcensor{2,1}),sa.mpValue]; + %VDxBMImat(v,6)=sa.mCurveArea(1)',num2str(splits(seven_pct_idx),3),'$'),... + 'Location','Best'); + + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + +set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{30}+BMI','fontsize',14); + + + +% 10 % +cur_split= splits(ten_pct_idx); +flg_split=cur_arg<=cur_split; +f=length(find(flg_split)); + +% calculate Log-Rank p-value, if sig, continue +survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group +fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group +sa.mSurvivalTime=survivedate; +sa.mFlgCensor=fcensor; + +sa=sa.fCalculateSurvivalCurve(); +sa=sa.fCombineSurvivalTime(); +sa=sa.fCompareSurvivalByLogrank(); + +% plot KM curves +f=figure(6); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + + text(30,0.25,['Medium risk group',10,'Low-risk incidence: ',num2str(rates(ten_pct_idx),3),'%'],... + 'FontSize',16,... + 'EdgeColor','r',... + 'LineWidth',2); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \leq ',num2str(splits(ten_pct_idx),3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI >',num2str(splits(ten_pct_idx),3),'$'),... + 'Location','Best'); + + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + +set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{30}+BMI','fontsize',14); + + + + % 15 % +cur_split= splits(fiftn_pct_idx); +flg_split=cur_arg<=cur_split; +f=length(find(flg_split)); + +% calculate Log-Rank p-value, if sig, continue +survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group +fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group +sa.mSurvivalTime=survivedate; +sa.mFlgCensor=fcensor; + +sa=sa.fCalculateSurvivalCurve(); +sa=sa.fCombineSurvivalTime(); +sa=sa.fCompareSurvivalByLogrank(); + +% plot KM curves +f=figure(7); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + + text(30,0.35,['High risk group',10,'Low-risk incidence: ',num2str(rates(fiftn_pct_idx),3),'%'],... + 'FontSize',16,... + 'EdgeColor','b',... + 'LineWidth',2); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \leq ',num2str(splits(fiftn_pct_idx),3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI >',num2str(splits(fiftn_pct_idx),3),'$'),... + 'Location','Best'); + + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + +set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{30}+BMI','fontsize',14); + + + % median % +cur_split= median_arg; +flg_split=cur_arg<=cur_split; +f=length(find(flg_split)); + +% calculate Log-Rank p-value, if sig, continue +survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group +fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group +sa.mSurvivalTime=survivedate; +sa.mFlgCensor=fcensor; + +sa=sa.fCalculateSurvivalCurve(); +sa=sa.fCombineSurvivalTime(); +sa=sa.fCompareSurvivalByLogrank(); + +% plot KM curves +f=figure(8); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); +% here +%[~,median_idx]= min(abs(splits-median_arg)); + text(35,0.175,['Split at median',10,'Low-risk incidence: ',num2str(rates(median_idx),3),'%'],... + 'FontSize',16,... + 'EdgeColor','k',... + 'LineWidth',2); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \leq ',num2str(median_arg,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI >',num2str(median_arg,3),'$'),... + 'Location','Best'); + + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + +set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{30}+BMI at median split','fontsize',14); + + %% Uncertainty in parameters + +f=figure(9); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +sum_pval = 0; +wgtd_ten_rate = 0; +wgtd_ten_split = 0; +ten_rate_vals = [0.09:0.001:0.11]; +wgtd_ten_splits = zeros(length(ten_rate_vals),1); +for i=1:length(ten_rate_vals), + [~,cur_pct_idx] = min(abs(rates-ten_rate_vals(i))); + cur_pval = pvals(cur_pct_idx); + sum_pval = sum_pval+(1/cur_pval); + wgtd_ten_splits(i) = splits(cur_pct_idx)*(1/cur_pval); + wgtd_ten_split = wgtd_ten_split+splits(cur_pct_idx)*(1/cur_pval); + wgtd_ten_rate = wgtd_ten_rate+rates(cur_pct_idx)*(1/cur_pval); +end +wgtd_ten_split = wgtd_ten_split/sum_pval; +wgtd_ten_rate = wgtd_ten_rate/sum_pval; +wgtd_ten_split_high =... + wgtd_ten_split +... + std(wgtd_ten_splits)/(sqrt(length(ten_rate_vals))*sum_pval); + +wgtd_ten_split_low =... + wgtd_ten_split -... + std(wgtd_ten_splits)/(sqrt(length(ten_rate_vals))*sum_pval); + + +% seven +sum_pval = 0; +wgtd_seven_rate = 0; +wgtd_seven_split = 0; +seven_rate_vals = [0.06:0.001:0.08]; +wgtd_seven_splits = zeros(length(seven_rate_vals),1); +for i=1:length(seven_rate_vals), + [~,cur_pct_idx] = min(abs(rates-seven_rate_vals(i))); + cur_pval = pvals(cur_pct_idx); + sum_pval = sum_pval+(1/cur_pval); + wgtd_seven_splits(i) = splits(cur_pct_idx)*(1/cur_pval); + wgtd_seven_split = wgtd_seven_split+splits(cur_pct_idx)*(1/cur_pval); + wgtd_seven_rate = wgtd_seven_rate+rates(cur_pct_idx)*(1/cur_pval); +end +wgtd_seven_split = wgtd_seven_split/sum_pval; +wgtd_seven_rate = wgtd_seven_rate/sum_pval; +wgtd_seven_split_high =... + wgtd_seven_split +... + std(wgtd_seven_splits)/(sqrt(length(seven_rate_vals))*sum_pval); + +wgtd_seven_split_low =... + wgtd_seven_split -... + std(wgtd_seven_splits)/(sqrt(length(seven_rate_vals))*sum_pval); + + +%fifteen +sum_pval = 0; +wgtd_fiftn_split = 0; +wgtd_fiftn_rate = 0; +fiftn_rate_vals = [0.14:0.001:0.16]; +wgtd_fiftn_splits = zeros(length(fiftn_rate_vals),1); +for i=1:length(fiftn_rate_vals), + [~,cur_pct_idx] = min(abs(rates-fiftn_rate_vals(i))); + cur_pval = pvals(cur_pct_idx); + sum_pval = sum_pval+(1/cur_pval); + wgtd_fiftn_splits(i) = splits(cur_pct_idx)*(1/cur_pval); + wgtd_fiftn_split = wgtd_fiftn_split+splits(cur_pct_idx)*(1/cur_pval); + wgtd_fiftn_rate = wgtd_fiftn_rate+rates(cur_pct_idx)*(1/cur_pval); +end +wgtd_fiftn_split = wgtd_fiftn_split/sum_pval; +wgtd_fiftn_rate = wgtd_fiftn_rate/sum_pval; +wgtd_fiftn_split_high =... + wgtd_fiftn_split +... + std(wgtd_fiftn_splits)/(sqrt(length(fiftn_rate_vals))*sum_pval); + +wgtd_fiftn_split_low =... + wgtd_fiftn_split -... + std(wgtd_fiftn_splits)/(sqrt(length(fiftn_rate_vals))*sum_pval); + + + + + + +[~,median_idx] = min(abs(splits-median_arg)); +% constant +b_bmi=beta_bmi(median_idx); +b_vd=beta_vd(median_idx); + +md_split=splits(median_idx); +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_median_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_median_pct,'Color','k'); +set(h_median_pct,'LineWidth',2); +set(h_median_pct,'LineStyle','--'); + +md_split=wgtd_ten_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_ten_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_ten_pct,'Color','r'); +set(h_ten_pct,'LineWidth',2); + + +md_split=wgtd_ten_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_ten_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_ten_pct_std,'Color','r'); +set(h_ten_pct_std,'LineWidth',2); +set(h_ten_pct_std,'LineStyle',':'); + +md_split=wgtd_ten_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_ten_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_ten_pct_std,'Color','r'); +set(h_ten_pct_std,'LineStyle',':'); +set(h_ten_pct_std,'LineWidth',2); + +md_split=wgtd_fiftn_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_fiftn_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_fiftn_pct,'Color','b'); +set(h_fiftn_pct,'LineWidth',2); + +md_split=wgtd_fiftn_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_fiftn_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_fiftn_pct_std,'Color','b'); +set(h_fiftn_pct_std,'LineWidth',2); +set(h_fiftn_pct_std,'LineStyle',':'); + +md_split=wgtd_fiftn_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_fiftn_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_fiftn_pct_std,'Color','b'); +set(h_fiftn_pct_std,'LineStyle',':'); +set(h_fiftn_pct_std,'LineWidth',2); + +md_split=wgtd_seven_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_seven_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_seven_pct,'Color','g'); +set(h_seven_pct,'LineWidth',2); + +md_split=wgtd_seven_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_seven_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_seven_pct_std,'Color','g'); +set(h_seven_pct_std,'LineWidth',2); +set(h_seven_pct_std,'LineStyle',':'); + +md_split=wgtd_seven_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_seven_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_seven_pct_std,'Color','g'); +set(h_seven_pct_std,'LineStyle',':'); +set(h_seven_pct_std,'LineWidth',2); + + +title(['Threshold for incidence in lower risk group',10,... + 'Weighted by 1/pval, errors \pm 1 S.E.'],'fontsize',15); +ylim([0 200]); +xlabel(['BMI'],'FontSize',14); +ylabel(['V_{30} [cc]'],'FontSize',14); +grid on; + +lgnd=legend([h_median_pct h_seven_pct h_ten_pct h_fiftn_pct],... + ['\leq ',num2str(rates(median_idx)*100,3),'% (Median split)'],... + ['\leq ',num2str(wgtd_seven_rate*100,3),'% (Low risk)'],... + ['\leq ',num2str(wgtd_ten_rate*100,3),'% (Medium risk)'],... + ['\leq ',num2str(wgtd_fiftn_rate*100,3),'% (High risk)']); +lgnd_title=get(lgnd,'title'); + +set(lgnd,'fontsize',14); +set(lgnd,'location','best'); +end \ No newline at end of file diff --git a/ChestWallLogVDxBMIa2b.m b/ChestWallLogVDxBMIa2b.m new file mode 100755 index 0000000..c48562e --- /dev/null +++ b/ChestWallLogVDxBMIa2b.m @@ -0,0 +1,464 @@ +function ChestWallLogVDxBMIa2b +tic; +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fig_loc = 'Z:\elw\MATLAB\cw_analy\figures\latest\'; +%fn = 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b2.1.mat'; +fn = 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b2.1.mat'; +CGobj = cell(length(fn),1); +screen_size=get(0,'ScreenSize'); + +%scrsz = get(0,'ScreenSize'); +%set(0,'DefaultFigurePosition',[scrsz(1)+scrsz(1)/4 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]); + +% load data +load(strcat(fp,fn),'CGobj_current'); +CGobj = CGobj_current; + +% select patients with data +f = CGobj.fPatientsWithComplicationData(); +CGobj = CGobj.fRemovePatient(~f); + +% survival/complication time +f2 = ~cellfun('isempty',{CGobj.mGrp.mDateComp}); % patients with no complication date +f3 = ~cellfun('isempty',{CGobj.mGrp.mDateLastFollowup}); % patients with no last follow up date +compdate = inf(CGobj.mNumInGrp,1); +lastfollowup = inf(CGobj.mNumInGrp,1); +compdate(f2) = ([CGobj.mGrp(f2).mDateComp] - [CGobj.mGrp(f2).mDateBaseline])' / 30; +lastfollowup(f3) = ([CGobj.mGrp(f3).mDateLastFollowup] - [CGobj.mGrp(f3).mDateBaseline])' / 30; +compdate = min( lastfollowup, compdate ); +flgcensor = [CGobj.mGrp.mFlgCensor]'; + +bmi = [CGobj.mGrp.mBMI]'; +bmi_idx = bmi>0; + +compdate = compdate(bmi_idx); +flgcensor = flgcensor(bmi_idx); + + + + +f = cellfun(@(x) strcmpi('VDxBMI',x),CGobj.mCoxParameter(:,1)); % search the label +VDxBMICox = CGobj.mCoxParameter{f,2}; % extract Cox model result +flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), VDxBMICox); % some fields are empty or infinite, indicating no data for those values +VDxBMICox = VDxBMICox(flgCox); +tmp_beta = {VDxBMICox.beta}; +is_inf = cellfun(@(x) length(x),tmp_beta); +is_inf = is_inf==1; +tmp_beta = tmp_beta(~is_inf); + + + +VDxBMICox = VDxBMICox(~is_inf); +betas = cell2mat(tmp_beta)'; + +sa=classKaplanMeierCurve(); + + +%for i=1:length(VDxBMICox) + +v30_idx=100; +VD99BMICox = VDxBMICox(v30_idx); +cur_vd = VD99BMICox.data_exposure(:,1); +cur_vd_beta = betas(v30_idx,1); + +cur_bmi = VD99BMICox.data_exposure(:,2); +cur_bmi_beta = betas(v30_idx,2); + +cur_arg = [cur_vd_beta*cur_vd+cur_bmi_beta*cur_bmi]; + +unique_arg = unique(cur_arg); +median_arg = median(cur_arg); + +rates = nan(length(unique_arg),1); +beta_vd = nan(length(unique_arg),1); +beta_bmi = nan(length(unique_arg),1); +splits = nan(length(unique_arg),1); +pvals = nan(length(unique_arg),1); +low_rates = nan(length(unique_arg),1); +below = nan(length(unique_arg),1); +above = nan(length(unique_arg),1); + + +flg_split2=-1; +numstart=2; +numend=length(unique_arg)-numstart; +for j=1:length(unique_arg) + + + split_arg = unique_arg(j); + + flg_split=cur_arg<=split_arg; + f=length(find(flg_split)); + if fnumend % one group has too few patients, skip it + continue; + end + if isequal(flg_split,flg_split2) % if it is the same grouping as previous, skip the computation and save the result directly + continue; + end + flg_split2=flg_split; + + % calculate Log-Rank p-value, if sig, continue + survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group + fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group + sa.mSurvivalTime=survivedate; + sa.mFlgCensor=fcensor; + + sa=sa.fCalculateSurvivalCurve(); + sa=sa.fCombineSurvivalTime(); + sa=sa.fCompareSurvivalByLogrank(); + + + lr_pval = sa.mpValue; + if lr_pval < 0.05 && cur_vd_beta>=0 && cur_bmi_beta>=0, + + % (n1,c1,n2,c2,p,flg,sa (flg: 0 -- positive corelation, 1 -- negative corelation, 2 -- not available)) + % VDxBMImat(v,1:5)=[length(survivedate{1,1}),sum(fcensor{1,1}), length(survivedate{2,1}),sum(fcensor{2,1}),sa.mpValue]; + %VDxBMImat(v,6)=sa.mCurveArea(1)med_bmi)); +med_bmi_low = median(bmi(bmimed_bmi)); +% med_bmi_low = median(bmi(bmi<=med_bmi)); +% +% +% med_bmi_low_vols = -(beta_bmi(1)/beta_vd(1))*med_bmi + splits./beta_vd(1); +% med_high_bmi_low_vols = -(beta_bmi(1)/beta_vd(1))*med_bmi_high + splits./beta_vd(1); +% med_low_bmi_low_vols = -(beta_bmi(1)/beta_vd(1))*med_bmi_low + splits./beta_vd(1); + +h1=plot(med_bmi_low_vols,low_rates,'r-','LineWidth',2);hold on; +h2=plot(med_high_bmi_low_vols,low_rates,'g-','LineWidth',2); +h3=plot(med_low_bmi_low_vols,low_rates,'b-','LineWidth',2); + +%h4=plot(med_bmi_low_vols,rates,'b-','LineWidth',2); + + +ylim([0 0.3]); +xlim([0 160]); +ylabel('Lower KM asymptotic incidence','FontSize',15); + +grid on; +xlabel('Split Volume [cc]','FontSize',15); +title(['Asymptotic CWP incidence below split vs volume'],'FontSize',15); +lgnd=legend([h3 h1 h2],... + ['BMI = ',num2str(med_bmi_low)],... + ['BMI = ',num2str(med_bmi)],... + ['BMI = ',num2str(med_bmi_high)],... + 'Location','SouthEast'); + set(lgnd,'FontSize',14); + + + + + +%% plot KM splits for above rates + +[rates,sort_idx] = sort(rates); +beta_vd=beta_vd(sort_idx); +beta_bmi=beta_bmi(sort_idx); +splits=splits(sort_idx); +pvals=pvals(sort_idx); + + + + % median % +[~,median_idx] = min(abs(splits-median_arg)); +b_bmi=beta_bmi(median_idx); +b_vd=beta_vd(median_idx); + +cur_split= median_arg; +flg_split=cur_arg<=cur_split; +f=length(find(flg_split)); + +% calculate Log-Rank p-value, if sig, continue +survivedate={compdate(flg_split); compdate(~flg_split)}; % survive time of each group +fcensor={flgcensor(flg_split); flgcensor(~flg_split)}; % censor flag for each group +sa.mSurvivalTime=survivedate; +sa.mFlgCensor=fcensor; + +sa=sa.fCalculateSurvivalCurve(); +sa=sa.fCombineSurvivalTime(); +sa=sa.fCompareSurvivalByLogrank(); +pval = sa.mpValue; +% plot KM curves +f=figure(8); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_km(1)=stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +h_km(2)=stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); +plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); +% here +%[~,median_idx]= min(abs(splits-median_arg)); + text(25,0.125,['Split at median',10,'Low-risk incidence: ',... + num2str(rates(median_idx),3),'%',10,... + 'p = ',num2str(pval,3)],... + 'FontSize',16,... + 'EdgeColor','k',... + 'LineWidth',2); + lgnd=legend(h_km,... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI \leq ',num2str(median_arg,3),'$'),... + strcat('$\beta_{V_{30}}\times V_{30}+\beta_{BMI}\times BMI >',num2str(median_arg,3),'$'),... + 'Location','Best'); + + set(lgnd,'FontSize',14); + h=legend; + set(h,'interpreter','latex'); + +set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months'],'fontsize',14); + ylabel(['Probability of CW Pain'],'fontsize',14); + title('V_{99,a2b=2.1}+BMI at median split','fontsize',14); + + %% Uncertainty in parameters + +f=figure(9); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +mid_range = [rates>quantile(rates,0.33)].*[ratesquantile(rates,0.66)]; +high_rates = rates(high_range==1); +high_pvals = pvals(high_range==1); + +sum_pval = 0; +wgtd_high_rate = 0; +wgtd_high_split = 0; +wgtd_high_splits = zeros(length(high_rates),1); + +for i=1:length(high_rates), + [~,cur_split_idx] = min(abs(rates-high_rates(i))); + cur_pval = high_pvals(i); + sum_pval = sum_pval+(1/cur_pval); + wgtd_high_splits(i) = splits(cur_split_idx)*(1/cur_pval); + wgtd_high_split = wgtd_high_split+splits(cur_split_idx)*(1/cur_pval); + wgtd_high_rate = wgtd_high_rate+rates(cur_split_idx)*(1/cur_pval); +end +wgtd_high_split = wgtd_high_split/sum_pval; +wgtd_high_rate = wgtd_high_rate/sum_pval; +wgtd_high_split_high =... + wgtd_high_split +... + std(wgtd_high_splits)/(sqrt(length(high_rates))*sum_pval); + +wgtd_high_split_low =... + wgtd_high_split -... + std(wgtd_high_splits)/(sqrt(length(high_rates))*sum_pval); + + +md_split=wgtd_mid_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_mid_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_mid_pct,'Color','r'); +set(h_mid_pct,'LineWidth',2); + + +md_split=wgtd_mid_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_mid_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_mid_pct_std,'Color','r'); +set(h_mid_pct_std,'LineWidth',2); +set(h_mid_pct_std,'LineStyle',':'); + +md_split=wgtd_mid_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_mid_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_mid_pct_std,'Color','r'); +set(h_mid_pct_std,'LineStyle',':'); +set(h_mid_pct_std,'LineWidth',2); + +md_split=wgtd_high_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_high_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_high_pct,'Color','b'); +set(h_high_pct,'LineWidth',2); + +md_split=wgtd_high_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_high_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_high_pct_std,'Color','b'); +set(h_high_pct_std,'LineWidth',2); +set(h_high_pct_std,'LineStyle',':'); + +md_split=wgtd_high_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_high_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_high_pct_std,'Color','b'); +set(h_high_pct_std,'LineStyle',':'); +set(h_high_pct_std,'LineWidth',2); + +md_split=wgtd_low_split; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_low_pct=ezplot(bmi_vs_vd,[0,40]); +set(h_low_pct,'Color','g'); +set(h_low_pct,'LineWidth',2); + +md_split=wgtd_low_split_high; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_low_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_low_pct_std,'Color','g'); +set(h_low_pct_std,'LineWidth',2); +set(h_low_pct_std,'LineStyle',':'); + +md_split=wgtd_low_split_low; +bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + md_split/b_vd; +h_low_pct_std=ezplot(bmi_vs_vd,[0,40]); +set(h_low_pct_std,'Color','g'); +set(h_low_pct_std,'LineStyle',':'); +set(h_low_pct_std,'LineWidth',2); + + +title(['Threshold for incidence in lower risk group',10,... + 'Weighted by 1/pval, errors \pm 1 S.E.'],'fontsize',15); +ylim([0 200]); +xlabel(['BMI'],'FontSize',14); +ylabel(['V_{99,a/b=2.1} [cc]'],'FontSize',14); +grid on; + +lgnd=legend([h_low_pct h_mid_pct h_high_pct],... + ['\leq ',num2str(wgtd_low_rate*100,3),'% (Low risk)'],... + ['\leq ',num2str(wgtd_mid_rate*100,3),'% (Medium risk)'],... + ['\leq ',num2str(wgtd_high_rate*100,3),'% (High risk)']); +lgnd_title=get(lgnd,'title'); + +set(lgnd,'fontsize',14); +set(lgnd,'location','best'); + + +% all splits with rate < 10% +f=figure(10); clf reset; hold on; % grid on; +set(f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + + + + +end \ No newline at end of file diff --git a/ChestWallPainAlpha2Beta.m b/ChestWallPainAlpha2Beta.m new file mode 100755 index 0000000..c890d17 --- /dev/null +++ b/ChestWallPainAlpha2Beta.m @@ -0,0 +1,137 @@ +function ChestWallPainAlpha2Beta +tic; + +fig_loc = 'Z:/elw/MATLAB/cw_analy/figures/latest/'; + +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; +fig_num=1; +if isunix + fp=strrep(fp,'G:','/media/SKI_G'); +end +%fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'}; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +%fn = {'RIMNER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; + +CGobj = cell(length(fn),1); + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +% load data + +load(strcat(fp,fn{1}),'CGobj_current'); +CGobj = CGobj_current; +CGgrp = CGobj.mGrp; +n_grp = CGobj.mNumInGrp; + +%tmp 2011/08/29 +%a2b = 0:0.1:25; +a2b = 0:0.5:10; + +a2b = [Inf a2b]; + +% select patients with data +% survival/complication time +f2 = ~cellfun('isempty',{CGgrp.mDateComp}); % patients with no complication date +f3 = ~cellfun('isempty',{CGgrp.mDateLastFollowup}); % patients with no last follow up date +compdate = inf(n_grp,1); +lastfollowup = inf(n_grp,1); +compdate(f2) = ([CGgrp(f2).mDateComp] - [CGgrp(f2).mDateBaseline])' / 30; +lastfollowup(f3) = ([CGgrp(f3).mDateLastFollowup] - [CGgrp(f3).mDateBaseline])' / 30; +compdate = min( lastfollowup, compdate ); +flgcensor = [CGgrp.mFlgCensor]'; + +a2b_vx = zeros(length(a2b),1); +a2b_logl = -inf(length(a2b),1); + +fig=figure(1); +set(gcf,'Position',ss_four2three); +hold on; + +colors = varycolor(length(a2b)); +% colors = cell(30,1); +% cur_color = [1:-0.05:0.5]'; +% for l=1:length(cur_color); +% colors{l}=[cur_color(l) 0 0]; +% colors{l+10}=[0 cur_color(l) 0]; +% colors{l+20}=[0 0 cur_color(l)]; +% end + +vx_logls = cell(length(a2b),1); +med_vx = -inf(length(a2b),1); + +for i=1:length(a2b) + + cur_a2b = a2b(i); + + % loop over V1 - V100 + max_vx=200; + cur_vx_logls = -inf(max_vx,1); + cur_med_vx = -inf(max_vx,1); + + + for k=1:max_vx + dose = k; + + vd=zeros(n_grp,1); % volume v at dose d + vd(:)=0; + + %loop of patients, calculate new dosebins and vXs + for j=1:n_grp + + num_fx = CGgrp(j).mFxNum; + cur_dosebins = CGgrp(j).mDoseBins_org; + vol = CGgrp(j).mVolCum; + if cur_a2b volume ); + if isempty(f) + cv(j) = 0; + continue; + end + f=f(end); % f won't be empty by definition + if vols(f) < vols(1) + %dv(j) = interp1( [new_dosebins(f); new_dosebins(f+1)], [vols(f); vols(f+1)], dose ); + dv(j) = interp1( [vols(f);vols(f+1)], [new_dosebins(f); new_dosebins(f+1)], volume); + else + dv(j) = 0; + end + + + end + + if sum(dv)==0 + break; + end + %[~,logl,~,~]=coxphfit(dv,compdate,'baseline',0,'censoring',flgcensor); + [~,logl,~,~]=coxphfit(dv,compdate,'censoring',flgcensor); + cur_dx_logls(k) = logl; + cur_med_dx(k) = median(dv); + end + + + + p=plot(1:max_dx,cur_dx_logls); + set(p,'Color',colors(i,:)) + [a2b_logl(i),a2b_dx(i)] = max(cur_dx_logls); + + med_dx(i) = cur_med_dx(a2b_dx(i)); + dx_logls{i}=cur_dx_logls; +end + + +%print_fig(fig,fig_loc,'a2b_dx_fits','png'); + +fn=['ChestWall_a2b_dv.mat']; + +save(strcat(fp,fn),'a2b','a2b_logl','a2b_dx','dx_logls',... + 'compdate','flgcensor'); +end \ No newline at end of file diff --git a/ChestWallPainAlpha2BetaLR.m b/ChestWallPainAlpha2BetaLR.m new file mode 100755 index 0000000..bbd7f0a --- /dev/null +++ b/ChestWallPainAlpha2BetaLR.m @@ -0,0 +1,75 @@ +function ChestWallPainAlpha2BetaLR +tic; + +fig_loc = 'Z:/elw/MATLAB/cw_analy/figures/latest/'; + +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; +%fn = {'RIMNER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +% load data + +load(strcat(fp,fn{1}),'CGobj_current'); + +%CGobj_current.mLymanN = 10.^(-1:0.1:1)'; +CGobj_current.mLymanN = 10.^(-2:0.1:0)'; + + %% Set dose correction to USCBED, calculate USCBEDs + for k=1:length([CGobj_current.mGrp]) + CGobj_current.mGrp(k).mBeta2AlphaCorrection = 'BED'; + CGobj_current.mGrp(k).mLymanN = 10.^(-2:0.1:0)'; + end + + +a2b = 0.5:0.5:25; +%a2b = 0:0.5:3; + +a2b = [Inf a2b]; +a2b_llhd = -inf(length(a2b),1); +a2b_loga = -inf(length(a2b),1); +for i=1:length(a2b) + + cur_a2b = a2b(i); + + CGobj_current.mBeta2Alpha = 1/cur_a2b; + + %% Run basic gEUD logistic analysis first + CGobj_current = CGobj_current.fCalculateEUD(); + % logistic regression analysis + CGobj_current = CGobj_current.fLogisticRegressionExact_EUD(); + + + st = [CGobj_current.mLogisticRegressionMat]; + dpf = [st.dev]; % deviations + st =[st.stats]; + df = [st.dfe]; % degree of freedom + dpf = dpf./df; % deviations per degree of freedom + [~,loc] = min(dpf); % the minimum deviation corresponds to the maximum likelihood + disp(['best loga for a2b: ',num2str(cur_a2b),' is ',num2str(-log10(CGobj_current.mLymanN(loc)))]); + loga = -log10(CGobj_current.mLymanN(loc)); + + + loglikelyhood = -0.5*dpf; + + + a2b_llhd(i) =loglikelyhood(loc); % the maximum loglikelyhood + + a2b_loga(i) = loga; +end + +fig=figure(1); +set(gcf,'Position',ss_four2three); + +a2b_llhd68 = repmat(max(a2b_llhd(2:end))-0.5* 1 /(length(CGobj_current.mGrp)-2),size(a2b)); + +plot(a2b(2:end),a2b_llhd(2:end),'rs--','LineWidth',2);hold on; +plot(a2b(2:end),a2b_llhd68(2:end),'r--','LineWidth',1); +textbp(['Physical Dose LLHD: ',num2str(a2b_llhd(1),3)],'FontSize',18); +hold off; + +end \ No newline at end of file diff --git a/ChestWallPainAlpha2BetaMaxBed.m b/ChestWallPainAlpha2BetaMaxBed.m new file mode 100755 index 0000000..f2783c7 --- /dev/null +++ b/ChestWallPainAlpha2BetaMaxBed.m @@ -0,0 +1,134 @@ +function ChestWallPainAlpha2BetaMaxBed + +%% Same looping coe as ChestWallPainAlpha2Beta, but runs Cox model on Max BED +% Also, dosen't save to external file but plots after loop, unlike Vd Cox model +% in ChestWallPainAlpha2Beta +tic; + +do_print =1; + + +fig_loc = 'Z:/elw/MATLAB/cw_analy/slides/figures/latest/'; + +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; + +CGobj = cell(length(fn),1); + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +% load data + +load(strcat(fp,fn{1}),'CGobj_current'); +CGobj = CGobj_current; +CGgrp = CGobj.mGrp; +n_grp = CGobj.mNumInGrp; + +%tmp 2011/08/29 +a2b = 0:0.1:25; +%a2b = 0:0.5:10; + +a2b = [Inf a2b]; + +% select patients with data +% survival/complication time +f2 = ~cellfun('isempty',{CGgrp.mDateComp}); % patients with no complication date +f3 = ~cellfun('isempty',{CGgrp.mDateLastFollowup}); % patients with no last follow up date +compdate = inf(n_grp,1); +lastfollowup = inf(n_grp,1); +compdate(f2) = ([CGgrp(f2).mDateComp] - [CGgrp(f2).mDateBaseline])' / 30; +lastfollowup(f3) = ([CGgrp(f3).mDateLastFollowup] - [CGgrp(f3).mDateBaseline])' / 30; +compdate = min( lastfollowup, compdate ); +flgcensor = [CGgrp.mFlgCensor]'; + +pttotal = ones(CGobj.mNumInGrp,1); +ptcomp = ones(CGobj.mNumInGrp,1); +ptcomp([CGgrp.mFlgCensor])=0; + + +max_bed_cox_logls = zeros(length(a2b),1); +max_bed_lr_logls = zeros(length(a2b),1); + +for i=1:length(a2b) + + cur_a2b = a2b(i); + + max_beds=zeros(n_grp,1); + %loop of patients, calculate new dosebins and vXs + for j=1:n_grp + + num_fx = CGgrp(j).mFxNum; + cur_dosebins = CGgrp(j).mDoseBins_org; + vol = CGgrp(j).mVolCum; + if cur_a2b0; + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + mv_logl(1,5) = cur_logl; + mv_aic(1,5) = -2*cur_logl + 2*2; + mv_pvals(1,5,:) = cur_stats.p; + + % V42 + KPS + [kpsCox,~,~] = CGobj{m}.fCoxParameter_DVH('KPS'); + kps_data = [kpsCox.data_exposure]; + [~,cur_logl,~,cur_stats]=... + coxphfit([kps_data tx_data],... + compdate,'baseline',0,'censoring',flgcensor); + + + + + % dosePerFx + cm2cw + [~,cur_logl,~,cur_stats]=... + coxphfit([dosePerFx_data cm2cw_data],compdate,'baseline',0,'censoring',flgcensor); + mv_logl(2,3) = cur_logl; + mv_aic(2,3) = -2*cur_logl + 2*2; + mv_pvals(2,3,:) = cur_stats.p; + + % dosePerFx + numFx + [~,cur_logl,~,cur_stats]=... + coxphfit([dosePerFx_data numFx_data],compdate,'baseline',0,'censoring',flgcensor); + mv_logl(2,4) = cur_logl; + mv_aic(2,4) = -2*cur_logl + 2*2; + mv_pvals(2,4,:) = cur_stats.p; + + % dosePerFx + bmi + [~,cur_logl,~,cur_stats]=... + coxphfit([dosePerFx_data(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + mv_logl(2,5) = cur_logl; + mv_aic(2,5) = -2*cur_logl + 2*2; + mv_pvals(2,5,:) = cur_stats.p; + + % cm2cw + numFx + [~,cur_logl,~,cur_stats]=... + coxphfit([cm2cw_data numFx_data],compdate,'baseline',0,'censoring',flgcensor); + mv_logl(3,4) = cur_logl; + mv_aic(3,4) = -2*cur_logl + 2*2; + mv_pvals(3,4,:) = cur_stats.p; + + % cm2cw + bmi + [~,cur_logl,~,cur_stats]=... + coxphfit([cm2cw_data(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + mv_logl(3,5) = cur_logl; + mv_aic(3,5) = -2*cur_logl + 2*2; + mv_pvals(3,5,:) = cur_stats.p; + + % numFx + bmi + [~,cur_logl,~,cur_stats]=... + coxphfit([numFx_data(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + mv_logl(4,5) = cur_logl; + mv_aic(4,5) = -2*cur_logl + 2*2; + mv_pvals(4,5,:) = cur_stats.p; + + + + %% V_{39} + D_{83} + % D_{83} models stored in DVxCox + % V_{39} models stored in VDxCox + % Run bivariate Cox PH Model with V_D and D_V + + + % Run LoadVxDxCoxPHModelFits.m first then + % loads vxdx_logl and vxdx_stats + load(vxdx_cphm_mat_str) + + figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + % shift x and y axis -1 to account for mBinsDose/mBinsVol shift + y_vxdx = [0:size(vxdx_logl',1)-1]; + x_vxdx = [0:size(vxdx_logl',2)-1]; + imagesc(x_vxdx,y_vxdx,vxdx_logl'); + set(gca,'YDir','normal'); + colorbar; + title('V_{D} + D_{V} Cox PH Model Log-Likelihood','FontSize',14); + xlabel('(V_{D}) Dose [Gy]','FontSize',14) + ylabel('(D_{V}) Volume [cc]','FontSize',14) + + [vxdx_max_dv, vxdx_max_vd] =find(vxdx_logl'==max(max(vxdx_logl'))); + vxdx_max_logl=max(max(vxdx_logl')); + mv_logl(6,7)=vxdx_max_logl; + mv_aic(6,7) = -2*vxdx_max_logl + 2*2; + + + % p-values + vd_pvals = cellfun(@(x) x.p(1), vxdx_stats); + dv_pvals = cellfun(@(x) x.p(2), vxdx_stats); + + vd_vxdx_min_pval = vd_pvals(vxdx_max_vd); + dv_vxdx_min_pval = dv_pvals(vxdx_max_dv); + + mv_pvals(6,7,2)=vd_vxdx_min_pval; + mv_pvals(6,7,1)=dv_vxdx_min_pval; + + idx_v30=31; + mv_pvals(7,8,2) = min(vd_pvals(idx_v30,:)); + mv_pvals(7,8,1) = min(dv_pvals(idx_v30,:)); + mv_logl(7,8) = max(vxdx_logl(30,:));% V_{30)} + + disp(['']); + disp('*******'); + disp(['Max LogL for D_{83} + V_{39} Model at: D_{',... + num2str(vxdx_max_dv),... + '} + V_{',... + num2str(vxdx_max_vd),... + '}']); + disp(['Corresponding pvalues, D_{',... + num2str(vxdx_max_dv),... + '}: ',... + num2str(dv_vxdx_min_pval),... + ' and V_{',... + num2str(vxdx_max_vd),... + '}: ',... + num2str(vd_vxdx_min_pval)]); + + % P-values for V_{39} coefficient in V_{39} + D_{83} model + figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + imagesc(x_vxdx,y_vxdx,vd_pvals'); + set(gca,'YDir','normal'); + colorbar + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + ylabel(['(D_{V}) Volume [Gy]'],'FontSize',14); + xlabel(['(V_{D}) Dose [Gy]'],'FontSize',14); + title('P-values for V_{D} coefficient in V_{D} + D_{V} CPHM','FontSize',14); + + + % P-values for D_{83} coefficient in V_{39} + D_{83} model + figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + imagesc(x_vxdx,y_vxdx,dv_pvals'); + set(gca,'YDir','normal'); + colorbar + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + ylabel(['(D_{V}) Volume [Gy]'],'FontSize',14); + xlabel(['(V_{D}) Dose [Gy]'],'FontSize',14); + title('P-values for D_{V} coefficient in V_{D} + D_{V} CPHM','FontSize',14); + + + + % Maximum p-val between the two + use_vx_pvals = vd_pvals>dv_pvals; + max_vxdx_pvals = vd_pvals.*use_vx_pvals + dv_pvals.*~use_vx_pvals; + + figure(fig_num); + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + h_vxdx_pvals = imagesc(x_vxdx,y_vxdx,max_vxdx_pvals'); + set(gca,'YDir','normal'); + colorbar; + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + %h_vxdx_pvals_axis = get(h_vxdx_pvals,'Parent'); + %clim_vxdx_pvals = get(h_vxdx_pvals_axis,'CLim'); + ylabel(['(D_{V}) Volume [cc]'],'FontSize',14); + xlabel(['(V_{D}) Dose [Gy]'],'FontSize',14); + title(['Max P-value between \beta_{\rm{V}_{\rm{D}}} and \beta_{\rm{D}_{\rm{V}}}'],'FontSize',14); + + + % Average when both are less than 0.05 + + avg_vxdx_pvals = vd_pvals+dv_pvals; + avg_vxdx_pvals = avg_vxdx_pvals./2; + [min_avg_row,min_avg_col] = find(avg_vxdx_pvals==min(min(avg_vxdx_pvals))); + + disp(['Minimum Avg D_{83}/V_{39} combination at V_{',... + num2str(min_avg_row),... + '} (p <= ',... + num2str(vd_pvals(min_avg_row,min_avg_col)),... + ') D_{',... + num2str(min_avg_col),... + '} (p <= ',... + num2str(dv_pvals(min_avg_row,min_avg_col)),... + ')']); + + use_vx = vd_pvals<=0.05; + use_dx = dv_pvals<=0.05; + use_min = use_vx.*use_dx; + min_pvals = vd_pvals.*use_min + dv_pvals.*use_min; + min_pvals = min_pvals./2; + min_pvals(~min_pvals)=Inf; + + figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + h_vxdx_min_avg_pvals = imagesc(x_vxdx,y_vxdx,min_pvals'); + set(gca,'YDir','normal'); + colorbar; + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + %h_vxdx_pvals_axis = get(h_vxdx_pvals,'Parent'); + %clim_vxdx_pvals = get(h_vxdx_pvals_axis,'CLim'); + ylabel(['(D_{V}) Volume [cc]'],'FontSize',14); + xlabel(['(V_{D}) Dose [Gy] '],'FontSize',14); + title(['Mean p-value for both < 0.05'],'FontSize',14); + + + + %% Number of Fractions and V_{39} + + [biCox,flgBiCox,flgBiAnti] = CGobj{m}.fCoxParameter_DVH('VDxFx'); + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('VDx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + dosebins = CGobj{m}.mBinsDose(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(6,6)=max(uni_logl); + mv_aic(6,6) = -2*max_bi_logl + 2; + mv_logl(4,6)=max_bi_logl; + mv_aic(4,6) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(dosebins,[uni_logl' repmat(numfx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni V_{39}','Uni NumFx','V_{39} + NumFx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at V_{',... + num2str(dosebins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('V_{D} + NumFx Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + vd_vd_numfx_min_pval = bi_p(1,idx_max_bi_logl); + numfx_vd_numfx_min_pval = bi_p(2,idx_max_bi_logl); + + + mv_pvals(8,8,1) = uni_p(idx_v30);% V_{30)} + mv_logl(8,8) = uni_logl(idx_v30);% V_{30)} + + mv_pvals(4,8,1) = bi_p(2,idx_v30); + mv_pvals(4,8,2) = bi_p(1,idx_v30); + mv_logl(4,8) = bi_logl(idx_v30);% V_{30)} + + [mv_pvals(6,6,1),idx_min_uni_p] = min(uni_p); + uniCox = uniCox(flgUniBiCox); + disp(['Best V_{39} Cox Model at V_{',num2str(dosebins(idx_min_uni_p)),'} is:']); + disp(uniCox(idx_min_uni_p)); + + mv_pvals(4,6,1) = numfx_vd_numfx_min_pval; + mv_pvals(4,6,2) = vd_vd_numfx_min_pval; + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(dosebins,[uni_p' bi_p' repmat(numfx_uni_p,size(uni_p'))],'.-'); + hold on; semilogy(dosebins,repmat(0.05,size(dosebins)),'g--','LineWidth',3); + h5=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');set(h1(2),'MarkerSize',12) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);set(h1(4),'MarkerSize',12); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni V_{39}','Bi V_{39}','Uni NumFx','Bi NumFx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('p-value','fontsize',18); + title('V_{D} + Number of Fractions'); + + + %% V_{39} + Tx + + %[biCox,flgBiCox,flgBiAnti] = CGobj{m}.fCoxParameter_DVH('VDxTx'); + f = cellfun(@(x) strcmpi('VDxTx',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('VDx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + dosebins = CGobj{m}.mBinsDose(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(1,6)=max_bi_logl; + mv_aic(1,6) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(dosebins,[uni_logl' repmat(tx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + h_mx_bi_logl=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni V_{39}','Uni Tx','V_{39} + Tx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at V_{',... + num2str(dosebins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('V_{D} + Tx Uni- and Bi-variate Log-likelihood'); + + + %plot p-values + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd and tx p-values at maximum logl point + vd_vd_tx_min_pval = bi_p(1,idx_max_bi_logl); + tx_vd_tx_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(1,6,1) = tx_vd_tx_min_pval; + mv_pvals(1,6,2) = vd_vd_tx_min_pval; + + mv_pvals(1,8,1) = bi_p(2,idx_v30); + mv_pvals(1,8,2) = bi_p(1,idx_v30); + mv_logl(1,8) = bi_logl(idx_v30);% V_{30)} + + + f3=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h3=semilogy(dosebins,[uni_p' bi_p' repmat(tx_uni_p,size(uni_p'))],'.-'); + hold on; semilogy(dosebins,repmat(0.05,size(dosebins)),'g--','LineWidth',3); + h5=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + hold off; + xlim([0 max(dosebins)]); + set(h3(1),'Color','b');set(h3(1),'LineWidth',2);set(h3(1),'MarkerSize',12) + set(h3(2),'Color','b');set(h3(2),'LineWidth',2);set(h3(2),'LineStyle',':');set(h3(2),'MarkerSize',12) + set(h3(3),'Color','r');set(h3(3),'LineWidth',2);set(h3(3),'MarkerSize',12);set(h3(3),'LineStyle',':'); + set(h3(4),'Color','r');set(h3(4),'LineWidth',2);set(h3(4),'MarkerSize',12) + legend([h3(1) h3(2) h3(4) h3(3) h5],'Uni V_{39}','Bi V_{39}','Uni Tx','Bi Tx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('p-value','fontsize',18); + title('V_{D} + Prescription Dose'); + + %% V_{39} + cm2cw + + f = cellfun(@(x) strcmpi('VDxCM2CW',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('VDx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + dosebins = CGobj{m}.mBinsDose(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(3,6)=max_bi_logl; + mv_aic(3,6) = -2*max_bi_logl + 2*2; + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(dosebins,[uni_logl' repmat(cm2cw_uni_logl,size(uni_logl')) bi_logl'],'.-'); + h_mx_bi_logl=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni V_{39}','Uni cm2cw','V_{39} + cm2cw','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at V_{',... + num2str(dosebins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('V_{D} + Distance to CW Uni- and Bi-variate Log-likelihood'); + + + %plot p-values + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd and tx p-values at maximum logl point + vd_vd_cm2cw_min_pval = bi_p(1,idx_max_bi_logl); + cm2cw_vd_cm2cw_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(3,6,1) = cm2cw_vd_cm2cw_min_pval; + mv_pvals(3,6,2) = vd_vd_cm2cw_min_pval; + + mv_pvals(3,8,1) = bi_p(2,idx_v30); + mv_pvals(3,8,2) = bi_p(1,idx_v30); + mv_logl(3,8) = bi_logl(idx_v30);% V_{30)} + + f3=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h3=semilogy(dosebins,[uni_p' bi_p' repmat(cm2cw_uni_p,size(uni_p'))],'.-'); + hold on; semilogy(dosebins,repmat(0.05,size(dosebins)),'g--','LineWidth',3); + h5=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + hold off; + xlim([0 max(dosebins)]); + set(h3(1),'Color','b');set(h3(1),'LineWidth',2);set(h3(1),'MarkerSize',12) + set(h3(2),'Color','b');set(h3(2),'LineWidth',2);set(h3(2),'LineStyle',':');set(h3(2),'MarkerSize',12) + set(h3(3),'Color','r');set(h3(3),'LineWidth',2);set(h3(3),'MarkerSize',12);set(h3(3),'LineStyle',':'); + set(h3(4),'Color','r');set(h3(4),'LineWidth',2);set(h3(4),'MarkerSize',12) + legend([h3(1) h3(2) h3(4) h3(3) h5],'Uni V_{39}','Bi V_{39}','Uni cm2cw','Bi cm2cw','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('p-value','fontsize',18); + title('V_{D} + Distance to CW'); + %% V_{39} + BMI + + %[biCox,flgBiCox,flgBiAnti] = CGobj{m}.fCoxParameter_DVH('VDxBMI'); + f = cellfun(@(x) strcmpi('VDxBMI',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('VDx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; % cut off when univariate goes anti-correlated + + dosebins = CGobj{m}.mBinsDose(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(5,6)=max_bi_logl; + mv_aic(5,6) = -2*max_bi_logl + 2*2; + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(dosebins,[uni_logl' repmat(bmi_uni_logl,size(uni_logl')) bi_logl'],'.-'); + h_mx_bi_logl=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni V_{39}','Uni BMI','V_{39} + BMI','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at V_{',... + num2str(dosebins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('V_{D} + BMI Uni- and Bi-variate Log-likelihood'); + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd and tx p-values at maximum logl point + vd_vd_bmi_min_pval = bi_p(1,idx_max_bi_logl); + bmi_vd_bmi_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(5,6,1) = bmi_vd_bmi_min_pval; + mv_pvals(5,6,2) = vd_vd_bmi_min_pval; + + mv_pvals(5,8,1) = bi_p(2,idx_v30); + mv_pvals(5,8,2) = bi_p(1,idx_v30); + mv_logl(5,8) = bi_logl(idx_v30);% V_{30)} + + f4=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h4=semilogy(dosebins,[uni_p' bi_p' repmat(bmi_uni_p,size(uni_p'))],'.-'); + hold on; semilogy(dosebins,repmat(0.05,size(dosebins)),'g--','LineWidth',3); + h5=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + + hold off; + xlim([0 max(dosebins)]); + set(h4(1),'Color','b');set(h4(1),'LineWidth',2);set(h4(1),'MarkerSize',12) + set(h4(2),'Color','b');set(h4(2),'LineWidth',2);set(h4(2),'LineStyle',':');set(h4(2),'MarkerSize',12) + set(h4(3),'Color','r');set(h4(3),'LineWidth',2);set(h4(3),'MarkerSize',12);set(h4(3),'LineStyle',':'); + set(h4(4),'Color','r');set(h4(4),'LineWidth',2);set(h4(4),'MarkerSize',12) + + legend([h4(1) h4(2) h4(4) h4(3) h5],'Uni V_{39}','Bi V_{39}','Uni BMI','Bi BMI','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('p-value','fontsize',18); + title('V_{D} + BMI'); + + %% V_{39} + Dose/fraction + + %[biCox,flgBiCox,flgBiAnti] = CGobj{m}.fCoxParameter_DVH('VDxBMI'); + f = cellfun(@(x) strcmpi('VDxDperFx',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('VDx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; % cut off when univariate goes anti-correlated + + dosebins = CGobj{m}.mBinsDose(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(2,6)=max_bi_logl; + mv_aic(2,6) = -2*max_bi_logl + 2*2; + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(dosebins,[uni_logl' repmat(dperfx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + h_mx_bi_logl=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(dosebins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni V_{39}','Uni Dose/Fx','V_{39} + Dose/Fx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at V_{',... + num2str(dosebins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('V_{D} + Dose/Fx Uni- and Bi-variate Log-likelihood'); + + + % plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + vd_vd_dperfx_min_pval = bi_p(1,idx_max_bi_logl); + dperfx_vd_dperfx_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(2,6,1) = dperfx_vd_dperfx_min_pval; + mv_pvals(2,6,2) = vd_vd_dperfx_min_pval; + + mv_pvals(2,8,1) = bi_p(2,idx_v30); + mv_pvals(2,8,2) = bi_p(1,idx_v30); + mv_logl(2,8) = bi_logl(idx_v30);% V_{30)} + + f5=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h5=semilogy(dosebins,[uni_p' bi_p' repmat(dperfx_uni_p,size(uni_p'))],'.-'); + hold on; semilogy(dosebins,repmat(0.05,size(dosebins)),'g--','LineWidth',3); + h6=plot([dosebins(idx_max_bi_logl) dosebins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + hold off; + xlim([0 max(dosebins)]); + set(h5(1),'Color','b');set(h5(1),'LineWidth',2);set(h5(1),'MarkerSize',12) + set(h5(2),'Color','b');set(h5(2),'LineWidth',2);set(h5(2),'LineStyle',':');set(h5(2),'MarkerSize',12) + set(h5(3),'Color','r');set(h5(3),'LineWidth',2);set(h5(3),'MarkerSize',12);set(h5(3),'LineStyle',':'); + set(h5(4),'Color','r');set(h5(4),'LineWidth',2);set(h5(4),'MarkerSize',12) + + legend([h5(1) h5(2) h5(4) h5(3) h6],'Uni V_{39}','Bi V_{39}','Uni Dose/Fx','Bi Dose/Fx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + xlabel('(V_{D}) Dose (Gy)','fontsize',18); ylabel('p-value','fontsize',18); + title('V_{D} + Dose per Fraction'); + + %% DV + Number of Fractions + + [biCox,flgBiCox,flgBiAnti] = CGobj{m}.fCoxParameter_DVH('DVxFx'); + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('DVx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + volbins = CGobj{m}.mBinsVol(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(4,7)=max_bi_logl; + mv_aic(4,7) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(volbins,[uni_logl' repmat(numfx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni D_{83}','Uni NumFx','D_{83} + NumFx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at D_{',... + num2str(volbins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(D_{83}) Volume [cc]','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('D_{83} + NumFx Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + dv_dv_numfx_min_pval = bi_p(1,idx_max_bi_logl); + numfx_dv_numfx_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(4,7,1) = numfx_dv_numfx_min_pval; + mv_pvals(4,7,2) = dv_dv_numfx_min_pval; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(volbins,[uni_p' bi_p' repmat(numfx_uni_p,size(uni_p'))]); + hold on; semilogy(volbins,repmat(0.05,size(volbins)),'g--','LineWidth',3); + h5=plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);%set(h1(1),'MarkerSize',5) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');%set(h1(2),'MarkerSize',5) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'LineStyle',':');%set(h1(3),'MarkerSize',5); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);%set(h1(4),'MarkerSize',5); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni D_{83}','Bi D_{83}','Uni NumFx','Bi NumFx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('p-value','fontsize',18); + title('D_{V} + Number of Fractions'); + + + %% DV + Prescription Dose + + f = cellfun(@(x) strcmpi('DVxTx',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('DVx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + volbins = CGobj{m}.mBinsVol(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(1,7)=max_bi_logl; + mv_aic(1,7) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(volbins,[uni_logl' repmat(tx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni D_{83}','Uni Tx','D_{83} + Tx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at D_{',... + num2str(volbins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('D_{V} + Tx Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + dv_dv_tx_min_pval = bi_p(1,idx_max_bi_logl); + tx_dv_tx_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(1,7,1) = tx_dv_tx_min_pval; + mv_pvals(1,7,2) = dv_dv_tx_min_pval; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(volbins,[uni_p' bi_p' repmat(tx_uni_p,size(uni_p'))]); + hold on; semilogy(volbins,repmat(0.05,size(volbins)),'g--','LineWidth',3); + h5=plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);%set(h1(1),'MarkerSize',5) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');%set(h1(2),'MarkerSize',5) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'LineStyle',':');%set(h1(3),'MarkerSize',5); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);%set(h1(4),'MarkerSize',5); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni D_{V}','Bi D_{V}','Uni Tx','Bi Tx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('p-value','fontsize',18); + title('D_{V} + Prescription Dose'); + + %% DV + Distance to Chest Wall + + f = cellfun(@(x) strcmpi('DVxCM2CW',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('DVx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + volbins = CGobj{m}.mBinsVol(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(3,7)=max_bi_logl; + mv_aic(3,7) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(volbins,[uni_logl' repmat(cm2cw_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni D_{V}','Uni cm2cw','D_{V} + cm2cw','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at D_{',... + num2str(volbins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('D_{V} + Distance to CW Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + dv_dv_cm2cw_min_pval = bi_p(1,idx_max_bi_logl); + cm2cw_dv_cm2cw_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(3,7,1) = cm2cw_dv_cm2cw_min_pval; + mv_pvals(3,7,2) = dv_dv_cm2cw_min_pval; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(volbins,[uni_p' bi_p' repmat(cm2cw_uni_p,size(uni_p'))]); + hold on; semilogy(volbins,repmat(0.05,size(volbins)),'g--','LineWidth',3); + h5=plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);%set(h1(1),'MarkerSize',5) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');%set(h1(2),'MarkerSize',5) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'LineStyle',':');%set(h1(3),'MarkerSize',5); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);%set(h1(4),'MarkerSize',5); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni D_{V}','Bi D_{V}','Uni cm2cw','Bi cm2cw','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('p-value','fontsize',18); + title('D_{V} + cm2cw'); + + %% DV + BMI + + f = cellfun(@(x) strcmpi('DVxBMI',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('DVx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + volbins = CGobj{m}.mBinsVol(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(5,7)=max_bi_logl; + mv_aic(5,7) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(volbins,[uni_logl' repmat(bmi_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni D_{V}','Uni BMI','D_{V} + BMI','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at D_{',... + num2str(volbins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('D_{V} + Distance to CW Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + dv_dv_bmi_min_pval = bi_p(1,idx_max_bi_logl); + bmi_dv_bmi_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(5,7,1) = bmi_dv_bmi_min_pval; + mv_pvals(5,7,2) = dv_dv_bmi_min_pval; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(volbins,[uni_p' bi_p' repmat(bmi_uni_p,size(uni_p'))]); + hold on; semilogy(volbins,repmat(0.05,size(volbins)),'g--','LineWidth',3); + h5=plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);%set(h1(1),'MarkerSize',5) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');%set(h1(2),'MarkerSize',5) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'LineStyle',':');%set(h1(3),'MarkerSize',5); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);%set(h1(4),'MarkerSize',5); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni D_{V}','Bi D_{V}','Uni BMI','Bi BMI','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('p-value','fontsize',18); + title('D_{V} + BMI'); + + %% DV + Dose/Fraction + + f = cellfun(@(x) strcmpi('DVxDperFx',x),CGobj{m}.mCoxParameter(:,1)); % search the label + biCox = CGobj{m}.mCoxParameter{f,2}; % extract Cox model result + flgCox = ~arrayfun( @(y) any(structfun(@(x) any(isempty(x(:)))|any(isinf(x(:))), y)), biCox); % some fields are empty or infinite, indicating no data for those values + tmp_beta = {biCox.beta}; + is_inf = cellfun(@(x) length(x),tmp_beta); + is_inf = is_inf==1; + tmp_beta = tmp_beta(~is_inf); + f = cell2mat(tmp_beta)'; + flgBiAnti = f<0; + + flgBiCox(flgBiAnti(:,1))=false; % anti-correlations were not be considered + + [uniCox,flgUniCox,flgUniAnti] = CGobj{m}.fCoxParameter_DVH('DVx'); + flgUniCox(flgUniAnti)=false; % anti-correlations were not be considered + + %flgUniBiCox=flgUniCox&flgBiCox; + flgUniBiCox=flgUniCox; + + volbins = CGobj{m}.mBinsVol(flgUniBiCox); + + % plot log-likelihood + uni_logl = [uniCox(flgUniBiCox).logl]; + bi_logl = [biCox(flgUniBiCox).logl]; + + [max_bi_logl,idx_max_bi_logl] = max(bi_logl); + + mv_logl(2,7)=max_bi_logl; + mv_aic(2,7) = -2*max_bi_logl + 2*2; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + + set(gcf,'Position',ss_four2three); + hold on; + h1=plot(volbins,[uni_logl' repmat(dperfx_uni_logl,size(uni_logl')) bi_logl'],'.-'); + plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);set(h1(1),'MarkerSize',12) + set(h1(2),'Color','r');set(h1(2),'LineWidth',2);set(h1(2),'MarkerSize',12) + set(h1(3),'Color','k');set(h1(3),'LineWidth',2);set(h1(3),'MarkerSize',12);set(h1(3),'LineStyle',':'); + + legend([h1(1) h1(2) h1(3)],'Uni D_{V}','Uni Dose/Fx','D_{V} + Dose/Fx','Location','Best'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + bi_logl_str = {['Max LogL = ', num2str(max_bi_logl,5),' at D_{',... + num2str(volbins(idx_max_bi_logl),4)],'}'}; + text(2,-337,bi_logl_str,'fontsize',16); + hold off; + grid on; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('Log-likelihood','fontsize',18); + title('D_{V} + Distance to CW Uni- and Bi-variate Log-likelihood'); + + + %plot pvals + bi_p = [biCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + uni_p = [uniCox(flgUniBiCox).p]; %ignore anti-correlated for V_{Dx} + + % vd adn numfx p-values at maximum logl point + dv_dv_dperfx_min_pval = bi_p(1,idx_max_bi_logl); + dperfx_dv_dperfx_min_pval = bi_p(2,idx_max_bi_logl); + + mv_pvals(2,7,1) = dperfx_dv_dperfx_min_pval; + mv_pvals(2,7,2) = dv_dv_dperfx_min_pval; + + + f1=figure(fig_num); clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h1=semilogy(volbins,[uni_p' bi_p' repmat(dperfx_uni_p,size(uni_p'))]); + hold on; semilogy(volbins,repmat(0.05,size(volbins)),'g--','LineWidth',3); + h5=plot([volbins(idx_max_bi_logl) volbins(idx_max_bi_logl)],... + ylim,'m--','LineWidth',2); + xlim([0 max(volbins)]); + set(h1(1),'Color','b');set(h1(1),'LineWidth',2);%set(h1(1),'MarkerSize',5) + set(h1(2),'Color','b');set(h1(2),'LineWidth',2);set(h1(2),'LineStyle',':');%set(h1(2),'MarkerSize',5) + set(h1(3),'Color','r');set(h1(3),'LineWidth',2);set(h1(3),'LineStyle',':');%set(h1(3),'MarkerSize',5); + set(h1(4),'Color','r');set(h1(4),'LineWidth',2);%set(h1(4),'MarkerSize',5); + + legend([h1(1) h1(2) h1(4) h1(3) h5],'Uni D_{V}','Bi D_{V}','Uni Dose/Fx','Bi Dose/Fx','Max LogL','Location','SouthWest'); + set(gca,'fontsize',14); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); + hold off; + xlabel('(D_{V}) Volume [cc]','fontsize',18); ylabel('p-value','fontsize',18); + title('D_{V} + Dose/Fx'); + + + + %% print pvals + + print_pvals = mv_pvals; + + % re-arrange + + %V_{39} 6->1 + print_pvals(1,1,:) = mv_pvals(6,6,:); + print_pvals(1,2,:) = mv_pvals(6,8,:);% VD + V30 + print_pvals(1,3,:) = mv_pvals(6,7,:);% VD + DV + print_pvals(1,4,:) = mv_pvals(1,6,:);% VD + Tx + print_pvals(1,5,:) = mv_pvals(2,6,:);% VD + DperFx + print_pvals(1,6,:) = mv_pvals(3,6,:);% VD + cm2cw + print_pvals(1,7,:) = mv_pvals(4,6,:);% VD + NumFx + print_pvals(1,8,:) = mv_pvals(5,6,:);% VD + BMI + + %V_{30} 8->2 + print_pvals(2,2,:) = mv_pvals(8,8,:); + print_pvals(2,3,:) = mv_pvals(7,8,:);% D83 + V30 + print_pvals(2,4,:) = mv_pvals(1,8,:);% Tx + V30 + print_pvals(2,5,:) = mv_pvals(2,8,:);% VD + DperFx + print_pvals(2,6,:) = mv_pvals(3,8,:);% VD + cm2cw + print_pvals(2,7,:) = mv_pvals(4,8,:);% VD + NumFx + print_pvals(2,8,:) = mv_pvals(5,8,:);% VD + BMI + + %D83 7->3 + print_pvals(3,3,:) = mv_pvals(7,7,:);% D83 + V30 + print_pvals(3,4,:) = mv_pvals(1,7,:);% Tx + V30 + print_pvals(3,5,:) = mv_pvals(2,7,:);% VD + DperFx + print_pvals(3,6,:) = mv_pvals(3,7,:);% VD + cm2cw + print_pvals(3,7,:) = mv_pvals(4,7,:);% VD + NumFx + print_pvals(3,8,:) = mv_pvals(5,7,:);% VD + BMI + + % Tx 1->4 + print_pvals(4,4,:) = mv_pvals(1,1,:);% D83 + V30 + print_pvals(4,5,:) = mv_pvals(1,2,:);% Tx + V30 + print_pvals(4,6,:) = mv_pvals(1,3,:);% VD + DperFx + print_pvals(4,7,:) = mv_pvals(1,4,:);% VD + cm2cw + print_pvals(4,8,:) = mv_pvals(1,5,:);% VD + NumFx + + % D/Fx 2->5 + print_pvals(5,5,:) = mv_pvals(2,2,:);% D83 + V30 + print_pvals(5,6,:) = mv_pvals(2,3,:);% Tx + V30 + print_pvals(5,7,:) = mv_pvals(2,4,:);% VD + DperFx + print_pvals(5,8,:) = mv_pvals(2,5,:);% VD + cm2cw + + % cm2cw 3->6 + print_pvals(6,6,:) = mv_pvals(3,3,:);% D83 + V30 + print_pvals(6,7,:) = mv_pvals(3,4,:);% Tx + V30 + print_pvals(6,8,:) = mv_pvals(3,5,:);% VD + DperFx + + % numFx 4->7 + print_pvals(7,7,:) = mv_pvals(4,4,:);% D83 + V30 + print_pvals(7,8,:) = mv_pvals(4,5,:);% Tx + V30 + + % BMI 5->8 + print_pvals(8,8,:) = mv_pvals(5,5,:);% D83 + V30 + + + mv_pvals=print_pvals; + + mv_logl(mv_logl==1)=NaN; + mv_aic(mv_aic==0)=NaN; + mv_pvals(mv_pvals==1)=NaN; + + + figure(fig_num);clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_two2two); + set(gcf,'Position',ss_full); + avg_pvals = (mv_pvals(:,:,1)+mv_pvals(:,:,2))./2; + h_pvals = imagesc(avg_pvals); + set(gca,'YDir','normal'); + set(gca,'XTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + set(gca,'YTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + set(gca,'FontSize',18); + set(h_pvals,'alphadata',~isnan(avg_pvals)); + colorbar; + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + + + first_pvals = mv_pvals(:,:,1); + diag_pvals = diag(first_pvals); + first_pvals = first_pvals-diag(diag(first_pvals)); + first_pvals(first_pvals==0)=NaN; + first_isnan = isnan(first_pvals); + %first_pvals(first_pvals<0.01)=0.01; + first_pvals = first_pvals(~first_isnan); + + second_pvals = mv_pvals(:,:,2); + second_isnan = isnan(second_pvals); + %second_pvals(second_pvals<0.01)=0.01; + second_pvals=second_pvals(~second_isnan); + + + first_pvals_strs = num2str(first_pvals(:),'%2.2g'); + second_pvals_strs = num2str(second_pvals(:),'%2.2g'); + diag_pvals_strs = num2str(diag_pvals(:),'%2.2g'); + + first_pvals_strs = strtrim(cellstr(first_pvals_strs));%# Remove any space padding + second_pvals_strs = strtrim(cellstr(second_pvals_strs));%# Remove any space padding + diag_pvals_strs = strtrim(cellstr(diag_pvals_strs));%# Remove any space padding + + [x_pvals,y_pvals] = meshgrid(1:8); %# x/y coordiantes for strings + x_diag_pvals = [1:8]; + y_diag_pvals = [1:8]; + + + text(x_pvals(~first_isnan),y_pvals(~first_isnan)+.25,first_pvals_strs,... + 'HorizontalAlignment','right','FontSize',16); + text(x_pvals(~second_isnan),y_pvals(~second_isnan)-.25,second_pvals_strs,... + 'HorizontalAlignment','left','FontSize',16); + text(x_diag_pvals,y_diag_pvals,diag_pvals_strs,... + 'HorizontalAlignment','center','FontSize',20); + + % diagnal lines to split boxes + line([1 8.5],[0 7.5],'Color','k'); + line([2 8.5],[0 6.5],'Color','k'); + line([3 8.5],[0 5.5],'Color','k'); + line([4 8.5],[0 4.5],'Color','k'); + line([5 8.5],[0 3.5],'Color','k'); + line([6 8.5],[0 2.5],'Color','k'); + line([7 8.5],[0 1.5],'Color','k'); + + % vertical lines + line([0.01 0.01],ylim,'Color','k'); + line(xlim,[0.01 0.01],'Color','k'); + line([1.5 1.5],[0 2.5],'Color','k'); + line([2.5 2.5],[0 3.5],'Color','k'); + line([3.5 3.5],[0 4.5],'Color','k'); + line([4.5 4.5],[0 5.5],'Color','k'); + line([5.5 5.5],[0 6.5],'Color','k'); + line([6.5 6.5],[0 7.5],'Color','k'); + line([7.5 7.5],[0 8.5],'Color','k'); + + % horizontal lines + line(xlim,[0 0],'Color','k'); + line([0.5 5.5],[1.5 1.5],'Color','k'); + line([1.5 5.5],[2.5 2.5],'Color','k'); + line([2.5 5.5],[3.5 3.5],'Color','k'); + line([3.5 5.5],[4.5 4.5],'Color','k'); + line([4.5 5.5],[5.5 5.5],'Color','k'); + line([5.5 6.5],[6.5 6.5],'Color','k'); + line([6.5 7.5],[7.5 7.5],'Color','k'); + line([7.5 8.5],[8.5 8.5],'Color','k'); + title('Multi-var Cox PH Model p-values','FontSize',18); + + + print_llhd = mv_logl; + + % re-arrange + + %V_{39} 6->1 + print_llhd(1,1,:) = mv_logl(6,6,:); + print_llhd(1,2,:) = mv_logl(6,8,:);% VD + V30 + print_llhd(1,3,:) = mv_logl(6,7,:);% VD + DV + print_llhd(1,4,:) = mv_logl(1,6,:);% VD + Tx + print_llhd(1,5,:) = mv_logl(2,6,:);% VD + DperFx + print_llhd(1,6,:) = mv_logl(3,6,:);% VD + cm2cw + print_llhd(1,7,:) = mv_logl(4,6,:);% VD + NumFx + print_llhd(1,8,:) = mv_logl(5,6,:);% VD + BMI + + %V_{30} 8->2 + print_llhd(2,2,:) = mv_logl(8,8,:); + print_llhd(2,3,:) = mv_logl(7,8,:);% D83 + V30 + print_llhd(2,4,:) = mv_logl(1,8,:);% Tx + V30 + print_llhd(2,5,:) = mv_logl(2,8,:);% VD + DperFx + print_llhd(2,6,:) = mv_logl(3,8,:);% VD + cm2cw + print_llhd(2,7,:) = mv_logl(4,8,:);% VD + NumFx + print_llhd(2,8,:) = mv_logl(5,8,:);% VD + BMI + + %D83 7->3 + print_llhd(3,3,:) = mv_logl(7,7,:);% D83 + V30 + print_llhd(3,4,:) = mv_logl(1,7,:);% Tx + V30 + print_llhd(3,5,:) = mv_logl(2,7,:);% VD + DperFx + print_llhd(3,6,:) = mv_logl(3,7,:);% VD + cm2cw + print_llhd(3,7,:) = mv_logl(4,7,:);% VD + NumFx + print_llhd(3,8,:) = mv_logl(5,7,:);% VD + BMI + + % Tx 1->4 + print_llhd(4,4,:) = mv_logl(1,1,:);% D83 + V30 + print_llhd(4,5,:) = mv_logl(1,2,:);% Tx + V30 + print_llhd(4,6,:) = mv_logl(1,3,:);% VD + DperFx + print_llhd(4,7,:) = mv_logl(1,4,:);% VD + cm2cw + print_llhd(4,8,:) = mv_logl(1,5,:);% VD + NumFx + + % D/Fx 2->5 + print_llhd(5,5,:) = mv_logl(2,2,:);% D83 + V30 + print_llhd(5,6,:) = mv_logl(2,3,:);% Tx + V30 + print_llhd(5,7,:) = mv_logl(2,4,:);% VD + DperFx + print_llhd(5,8,:) = mv_logl(2,5,:);% VD + cm2cw + + % cm2cw 3->6 + print_llhd(6,6,:) = mv_logl(3,3,:);% D83 + V30 + print_llhd(6,7,:) = mv_logl(3,4,:);% Tx + V30 + print_llhd(6,8,:) = mv_logl(3,5,:);% VD + DperFx + + % numFx 4->7 + print_llhd(7,7,:) = mv_logl(4,4,:);% D83 + V30 + print_llhd(7,8,:) = mv_logl(4,5,:);% Tx + V30 + + % BMI 5->8 + print_llhd(8,8,:) = mv_logl(5,5,:);% D83 + V30 + + + mv_logl = print_llhd; + + % Print Logl + figure(fig_num);clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + h_logl = imagesc(mv_logl); + set(gca,'YDir','normal'); + %set(gca,'XTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); + %set(gca,'YTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); + set(gca,'XTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + set(gca,'YTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + set(gca,'FontSize',16); + set(h_logl,'alphadata',~isnan(mv_logl)); + colorbar; + %mycmap = get(gcf,'Colormap'); + %set(gcf,'Colormap',flipud(mycmap)); + + is_nan = isnan(mv_logl(:)); + logl_values = num2str(mv_logl(:),'%6.4g'); + logl_values = strtrim(cellstr(logl_values));%# Remove any space padding + [x_logl,y_logl] = meshgrid(1:8); %# x/y coordiantes for strings + h_logl_strings = text(x_logl(~is_nan),y_logl(~is_nan),logl_values(~is_nan),... + 'HorizontalAlignment','center','FontSize',18); + title('Cox PH Model Log-likelihood','FontSize',18); + + + % Print AIC +% figure(fig_num);clf reset; +% fig_num=fig_num+1; +% set(gcf,'Position',ss_four2three); +% h_aic = imagesc(mv_aic); +% set(gca,'YDir','normal'); +% set(gca,'XTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); +% set(gca,'YTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); +% set(gca,'FontSize',16); +% set(h_aic,'alphadata',~isnan(mv_aic)); +% colorbar; +% mycmap = get(gcf,'Colormap'); +% set(gcf,'Colormap',flipud(mycmap)); +% +% is_nan = isnan(mv_aic(:)); +% aic_values = num2str(mv_aic(:),'%6.3g'); +% aic_values = strtrim(cellstr(aic_values));%# Remove any space padding +% [x_aic,y_aic] = meshgrid(1:8); %# x/y coordiantes for strings +% h_aic_strings = text(x_aic(~is_nan),y_aic(~is_nan),aic_values(~is_nan),... +% 'HorizontalAlignment','center','FontSize',18); +% title('Cox PH Model AIC','FontSize',18); +% +% +% +% min_info_loss = mv_aic; +% uni_aics = diag(min_info_loss); +% +% prob_min_info_loss = zeros(size(min_info_loss)); +% for i=1:8 +% prob_min_info_loss(i,:) = exp((min_info_loss(i,:)-uni_aics(i))./2); +% end +% prob_min_info_loss(prob_min_info_loss>=1)=NaN; +% +% +% % Print AIC Probability Information Loss +% figure(fig_num);clf reset; +% set(gcf,'Position',ss_four2three); +% fig_num=fig_num+1; +% h_prob_il = imagesc(prob_min_info_loss); +% set(gca,'YDir','normal'); +% set(gca,'XTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); +% set(gca,'YTickLabel',{'Tx','Dose/Fx','cm2cw','NumFx','BMI','V_{39}','D_{83}'}); +% set(gca,'FontSize',16); +% +% set(h_prob_il,'alphadata',~isnan(prob_min_info_loss)); +% colorbar; +% mycmap = get(gcf,'Colormap'); +% set(gcf,'Colormap',flipud(mycmap)); +% +% is_nan = isnan(prob_min_info_loss(:)); +% il_values = num2str(prob_min_info_loss(:),'%6.2g'); +% il_values = strtrim(cellstr(il_values));%# Remove any space padding +% [x_il,y_il] = meshgrid(1:8); %# x/y coordiantes for strings +% h_il_strings = text(x_il(~is_nan),y_il(~is_nan),il_values(~is_nan),... +% 'HorizontalAlignment','center','FontSize',18); +% title('Relative Prob of Info Loss (compared to univar)','FontSize',18); +% + + % Log-Likelihood Ratio P-values + + mv_llr_stats = -2.*mv_logl; + uni_llr_stats = diag(mv_llr_stats); + + llr_pvals1 = zeros(size(mv_llr_stats)); + llr_pvals2 = zeros(size(mv_llr_stats)); + for i=1:8 + cur_llr_stats = uni_llr_stats(i)-mv_llr_stats(i,:); + llr_pvals1(i,:) = 1-chi2cdf(cur_llr_stats,1); % 1 additional variable + cur_llr_stats2 = uni_llr_stats(i)-mv_llr_stats(:,i); + llr_pvals2(:,i) = 1-chi2cdf(cur_llr_stats2,1); % 1 additional variable + end + llr_pvals = max(llr_pvals1,llr_pvals2); + llr_pvals(llr_pvals==1)=NaN; + + + figure(fig_num);clf reset; + fig_num=fig_num+1; + set(gcf,'Position',ss_four2three); + + h_llr_pvals = imagesc(llr_pvals); + set(gca,'YDir','normal'); + set(gca,'XTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + set(gca,'YTickLabel',{'V_{39}','V_{30}','D_{83}','Tx','Dose/Fx','cm2cw','NumFx','BMI'}); + + set(gca,'FontSize',16); + set(h_llr_pvals,'alphadata',~isnan(llr_pvals)); + colorbar; + mycmap = get(gcf,'Colormap'); + set(gcf,'Colormap',flipud(mycmap)); + + is_nan = isnan(llr_pvals(:)); + llr_pvals(llr_pvals<0.001) = 0.001; + llr_values = num2str(llr_pvals(:),'%2.2g'); + llr_values = strtrim(cellstr(llr_values));%# Remove any space padding + [x_il,y_il] = meshgrid(1:8); %# x/y coordiantes for strings + h_llr_pval_strings = text(x_il(~is_nan),y_il(~is_nan),llr_values(~is_nan),... + 'HorizontalAlignment','center','FontSize',18); + title('Maximum Log-Likelihood Ratio Statistic p-values','FontSize',18); + + %% Tri-variate model + + % Tx + cm2cw + bmi + % Tx + BMI + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) cm2cw_data(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + cm2cw + BMI'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' cm2cw: ',num2str(tri_beta(2)),... + ' bmi: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' cm2cw: ',num2str(tri_se(2)),... + ' bmi: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' cm2cw: ',num2str(tri_p(2)),... + ' bmi: ',num2str(tri_p(3))]); + + + %% Tx + cm2cw + V_{39} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data cm2cw_data v39_data],... + compdate,'baseline',0,'censoring',flgcensor); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + cm2cw + V_{39}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' cm2cw: ',num2str(tri_beta(2)),... + ' vd: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' cm2cw: ',num2str(tri_se(2)),... + ' vd: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' cm2cw: ',num2str(tri_p(2)),... + ' vd: ',num2str(tri_p(3))]); + + + %% Tx + bmi + V_{39} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) bmi_data(bmi_idx) v39_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + bmi + V_{39}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' vd: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' vd: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' vd: ',num2str(tri_p(3))]); + %% Tx + bmi + V_{30} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) bmi_data(bmi_idx) v30_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + bmi + V_{30}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' v30: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' v30: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' v30: ',num2str(tri_p(3))]); +%% VD + BMI + DosePerFx + [~,cur_logl,~,cur_stats]=... + coxphfit([v39_data(bmi_idx) bmi_data(bmi_idx) dosePerFx_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{39} + BMI + DosePerFx'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' V_{39}: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' Dose/Fx: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' V_{39}: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' Dose/Fx: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' V_{39}: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' Dose/Fx: ',num2str(tri_p(3))]); +%% V30 + BMI + DosePerFx + [~,cur_logl,~,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx) dosePerFx_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{30} + BMI + DosePerFx'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' V_{30}: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' Dose/Fx: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' V_{30}: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' Dose/Fx: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' V_{30}: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' Dose/Fx: ',num2str(tri_p(3))]); + %% VD + BMI + cm2cw + [~,cur_logl,~,cur_stats]=... + coxphfit([v39_data(bmi_idx) bmi_data(bmi_idx) cm2cw_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{39} + BMI + cm2cw'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' V_{39}: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' cm2cw: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' V_{39}: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' cm2cw: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' V_{39}: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' cm2cw: ',num2str(tri_p(3))]); + %% V30 + BMI + cm2cw + [~,cur_logl,~,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx) cm2cw_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{30} + BMI + cm2cw'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' V_{30}: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' cm2cw: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' V_{30}: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' cm2cw: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' V_{30}: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' cm2cw: ',num2str(tri_p(3))]); + + %% V_{39} + BMI + D_{83} + [~,cur_logl,~,cur_stats]=... + coxphfit([v39_data(bmi_idx) bmi_data(bmi_idx) d83_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + + + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{39} + bmi + D_{83}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' vd: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' dv: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' vd: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' dv: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' vd: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' dv: ',num2str(tri_p(3))]); + + %% V_{30} + BMI + D_{83} + [~,cur_logl,~,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx) d83_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + + + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('V_{30} + bmi + D_{83}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' v30: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' dv: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' v30: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' dv: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' v30: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' dv: ',num2str(tri_p(3))]); + + + %% Tx + cm2cw + bmi + V_{39} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) cm2cw_data(bmi_idx) bmi_data(bmi_idx) v39_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + quad_logl = cur_logl; + quad_aic = -2*cur_logl + 2*4; + quad_beta = cur_stats.beta; + quad_se = cur_stats.se; + quad_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + cm2cw + bmi + V_{39}'); + disp(['LogL: ',num2str(quad_logl)]); + disp(['AIC: ',num2str(quad_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(quad_beta(1)),... + ' cm2cw: ',num2str(quad_beta(2)),... + ' bmi: ',num2str(quad_beta(3)),... + ' vd: ',num2str(quad_beta(4))]); + disp(['se: ']); + disp([' tx: ',num2str(quad_se(1)),... + ' cm2cw: ',num2str(quad_se(2)),... + ' bmi: ',num2str(quad_se(3)),... + ' vd: ',num2str(quad_se(4))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(quad_p(1)),... + ' cm2cw: ',num2str(quad_p(2)),... + ' bmi: ',num2str(quad_p(3)),... + ' vd: ',num2str(quad_p(4))]); + + + + + %% V_{30} + BMI + Tx + Dose/Fx + [~,cur_logl,~,cur_stats]=... + coxphfit([v30_data(bmi_idx) bmi_data(bmi_idx) tx_data(bmi_idx) dosePerFx_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + quad_logl = cur_logl; + quad_aic = -2*cur_logl + 2*4; + quad_beta = cur_stats.beta; + quad_se = cur_stats.se; + quad_p = cur_stats.p; + +% [quad_p,p_idx] = sort(quad_p); +% quad_se = quad_se(p_idx); +% quad_beta = quad_beta(p_idx); +% quad_aic = quad_aic(p_idx); +% quad_logl = quad_logl(p_idx); + + disp(['']); + disp('***********'); + disp('V_{30} + BMI + Tx + Dose/Fx'); + disp(['LogL: ',num2str(quad_logl)]); + disp(['AIC: ',num2str(quad_aic)]); + disp(['beta: ']); + disp([' v30: ',num2str(quad_beta(1)),... + ' bmi: ',num2str(quad_beta(2)),... + ' tx: ',num2str(quad_beta(3)),... + ' Dose/Fx: ',num2str(quad_beta(4))]); + disp(['se: ']); + disp([' v30: ',num2str(quad_se(1)),... + ' bmi: ',num2str(quad_se(2)),... + ' tx: ',num2str(quad_se(3)),... + ' Dose/Fx: ',num2str(quad_se(4))]); + disp(['p_vals: ']); + disp([' v30: ',num2str(quad_p(1)),... + ' bmi: ',num2str(quad_p(2)),... + ' tx: ',num2str(quad_p(3)),... + ' Dose/Fx: ',num2str(quad_p(4))]); + + %% Tx + bmi + V_{99} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) bmi_data(bmi_idx) v99_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + bmi + V_{99}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' v99: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' v99: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' v99: ',num2str(tri_p(3))]); + + %% Tx + bmi + V_{165} + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data(bmi_idx) bmi_data(bmi_idx) v165_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + bmi + V_{165}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' bmi: ',num2str(tri_beta(2)),... + ' v165: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' bmi: ',num2str(tri_se(2)),... + ' v165: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' bmi: ',num2str(tri_p(2)),... + ' v165: ',num2str(tri_p(3))]); + + + %% KPS + [~,cur_logl,~,cur_stats]=... + coxphfit([tx_data kps_data v39_data],... + compdate,'baseline',0,'censoring',flgcensor); + tri_logl = cur_logl; + tri_aic = -2*cur_logl + 2*3; + tri_beta = cur_stats.beta; + tri_se = cur_stats.se; + tri_p = cur_stats.p; + + disp(['']); + disp('***********'); + disp('Tx + KPS + V_{39}'); + disp(['LogL: ',num2str(tri_logl)]); + disp(['AIC: ',num2str(tri_aic)]); + disp(['beta: ']); + disp([' tx: ',num2str(tri_beta(1)),... + ' kps: ',num2str(tri_beta(2)),... + ' v39: ',num2str(tri_beta(3))]); + disp(['se: ']); + disp([' tx: ',num2str(tri_se(1)),... + ' kps: ',num2str(tri_se(2)),... + ' v39: ',num2str(tri_se(3))]); + disp(['p_vals: ']); + disp([' tx: ',num2str(tri_p(1)),... + ' kps: ',num2str(tri_p(2)),... + ' v39: ',num2str(tri_p(3))]); + + disp(sprintf('\n')); + disp(sprintf('\n')); + disp(' Variable beta se logl p-val'); + + disp(uni_print); + +end + + +toc; +end \ No newline at end of file diff --git a/ChestWallPainDisplay.m b/ChestWallPainDisplay.m new file mode 100755 index 0000000..1d99cb5 --- /dev/null +++ b/ChestWallPainDisplay.m @@ -0,0 +1,474 @@ +function ChestWallPainDisplay +tic; +% prepare +%fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\Desktop\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; +fig_loc = 'Z:/elw/MATLAB/cw_analy/slides/figures/latest/'; + +if isunix + fp=strrep(fp,'G:','/media/SKI_G'); +end +fn = {%'RIMNER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat',... + %'RIMNER_BC_SEPT10_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat',... + %'RIMNER_AC_SEPT10_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat',... + 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'}; + %'MUTTER_BC_SEPT10_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat',... + %'MUTTER_AC_SEPT10_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'}; + + %test + fn={'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2bInf.mat'}; + +CGobj = cell(length(fn),1); + +screen_size=get(0,'ScreenSize'); + +% load data +for m = 1:length(fn) + load(strcat(fp,fn{m}),'CGobj_current'); + CGobj{m} = CGobj_current; +end + + +for m = 1:length(fn) + disp(fn{m}); + CGobj{m}.fCoxFig_DVH('VDx'); + set(figure(1),'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + set(figure(1),'Name',fn{m}); + set(figure(2),'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + set(figure(2),'Name',fn{m}); + %CGobj{m}.fCoxFig_DVH('Vx'); + continue; + + figure(4); clf reset; + CGobj{m}.fCoxRiskVDxFig_DVH(); + xlabel(''); ylabel(''); + figure(5); + CGobj{m}.fCoxRiskVDxFig_DVH(30); + xlabel(''); ylabel(''); + +end + + + + +% plot DVH groups +disp('DVH groups'); +for m = 1:length(fn) + cur_f=figure(m); clf reset; hold on; + set(cur_f,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + set(cur_f,'Name',fn{m}); + CGobj{m}.fDVHCurvesSummary_DVH(); + xlabel('Dose [Gy]','FontSize',18);ylabel('Vol [cc]','FontSize',18); +end + + + + + +% plot DVHs +disp('DVH curves:'); +for m = 1:length(fn) + disp(fn{m}); + f1=figure(m); clf reset; hold on; % grid on; + set(f1,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + f = [CGobj{m}.mGrp.mFlgCensor]; + % DVHs of censored patients + g = find(f); + for k = 1:length(g) + plot(CGobj{m}.mGrp(g(k)).mDoseBins_org, CGobj{m}.mGrp(g(k)).mVolCum); + end + % DVHs of complicated patients + g = find(~f); + for k = 1:length(g) + plot(CGobj{m}.mGrp(g(k)).mDoseBins_org, CGobj{m}.mGrp(g(k)).mVolCum,'r'); + end + xlabel('Dose [Gy]','FontSize',18); + ylabel('Vol [cc]','FontSize',18); + set(gca,'xminortick','on','yminortick','on'); + +end + + + + +% median complication time +%mediantime(cw_dataset,cur_comp); + + + +% plot V22Gy vs. complication +disp('CW pain vs. V22Gy'); +m = 1; +d = 22; +% extract V22Gy +vd=zeros(CGobj{m}.mNumInGrp,1); % volume v at dose d +% volume under d +for k=1:CGobj{m}.mNumInGrp + vd(k) = CGobj{m}.mGrp(k).fVolAtDose(d); +end +% complication +flgcensor = [CGobj{m}.mGrp.mFlgCensor]'; +% plot +figure(m); clf reset; +plot(vd(flgcensor),0,'b*', vd(~flgcensor),1,'r*'); + +% survival curves +disp('Survival curves'); +m=1; +figure(m+m-1); clf reset; hold on; % grid on; +sa = CGobj{m}.mKaplanMeierSurvivalOverall; +stairs(sa.mSurvivalTimeSorted{1},sa.mSurvivalCurve{1}); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +set(gca,'Ylim',[0,1]); +% xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +set(gca,'xminortick','on','yminortick','on'); +xlabel(['Months']); +ylabel(['Overall survival probability']); +% median survival time +disp(['median survival time: ',num2str(median(sa.mSurvivalTime{1}))]); + + +% complication incidence curve +disp('Complication incidence curves'); +m = 1; +cur_fig=figure(m+100); clf reset; hold on; % grid on; +set(cur_fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +sa = CGobj{m}.mKaplanMeierCompOverall; +stairs(sa.mSurvivalTimeSorted{1}./12,1-sa.mSurvivalCurve{1},'LineWidth',2); +plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1))./12,... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+','MarkerSize',15); +% xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +set(gca,'xminortick','on','yminortick','on'); +xlabel('Years','FontSize',18); +ylabel('Inicidence of grade >= 2 Chestwall Pain','FontSize',18); +set(gca,'FontSize',16); +text(3,0.1,['Median onset time: ',num2str(median(sa.mSurvivalTime{1}(~sa.mFlgCensor{1}))/12,2),' yr'],'FontSize',18,'BackgroundColor','w'); +grid on; + +% median incident time +disp(['meidan incident time: ', num2str(median(sa.mSurvivalTime{1}(~sa.mFlgCensor{1})))]); + + +set(cur_fig,'Color','w'); +export_fig(cur_fig,... + [fig_loc,'cwp_cuminc'],'-pdf'); +disp(['Saving ',fig_loc,'cwp_cuminc.pdf']); + + + +% Relapse free +% figure(m+m); clf reset; hold on; % grid on; +% sa = CGobj{m}.mKaplanMeierRelapseFree; +% stairs(sa.mSurvivalTimeSorted{1},sa.mSurvivalCurve{1}); +% plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... +% sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); +% set(gca,'Ylim',[0,1]); +% % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); +% set(gca,'xminortick','on','yminortick','on'); + + +% Cox model p-value curves +disp('Cox model p-values:'); +p_significant=0.05; +for m = 1:length(fn) + disp(fn{m}); + % VDx + disp('VDx'); + figure(1); clf reset; + [pCox,fCox] = CoxP(CGobj{m},'VDx'); + semilogy(CGobj{m}.mBinsDose,pCox,'b.-'); hold on; + % semilogy(CGobj{m}.mBinsDose(fCox),pCox(fCox),'r*'); + semilogy(CGobj{m}.mBinsDose,repmat(p_significant,size(CGobj{m}.mBinsDose)),'r--'); + hold off; % grid on; + set(gca,'xminortick','on','yminortick','on'); + disp(['p-values: V20: ',num2str(pCox(21)),' V30: ', num2str(pCox(31))]); + % DVx + disp('DVx'); + figure(2); clf reset; + [pCox,fCox] = CoxP(CGobj{m},'DVx'); + semilogy(CGobj{m}.mBinsVol,pCox,'b.-'); hold on; + semilogy(CGobj{m}.mBinsVol,repmat(p_significant,size(CGobj{m}.mBinsVol)),'r--'); + hold off; % grid on; + set(gca,'xminortick','on','yminortick','on'); + + + + % confidence interval + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % the following code heavily depends on the curve's shape and has to be modified accordingly% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + disp('CI'); + figure(3); clf reset; + [allCox,flgCox,~] = CGobj{m}.fCoxParameter_DVH('VDx'); + logl = [allCox.logl]; + f = [allCox(flgCox).p]>0.3; + g = find(flgCox); + logl(g(f)) = -inf; % modify the loglikelihood of apparently non-significant points to avoid their disturbance in the following computation + [mx,mxloc] = max(logl); % the maximum log likelihood and its location + pct68 = mx - 0.5; % 68% confidence + pct95 = mx - 1.96; % 95% confidence + plot(CGobj{m}.mBinsDose(flgCox),[allCox(flgCox).logl],'b.-'); hold on; + plot(CGobj{m}.mBinsDose(flgCox),repmat(pct68,size(CGobj{m}.mBinsDose(flgCox))),'r--'); + plot(CGobj{m}.mBinsDose(flgCox),repmat(pct95,size(CGobj{m}.mBinsDose(flgCox))),'c--'); + hold off; + set(gca,'xminortick','on','yminortick','on'); + % compute the CI intervals + % 68% + % left end point + g = find([logl(1:mxloc)] <= pct68); + if isempty(g) % the curve is above pct68 + pct68l = -1; + else % the curve climbed from below to above pct68 + fg = [g(end) g(end)+1]; + pct68l = interp1([logl(fg)],CGobj{m}.mBinsDose(fg),pct68); + end + % right end point + g = [logl(mxloc+1:end)] >= pct68; + if all(g) % the curve is above pct68 + pct68r = -1; + else % the curve slide down below pct68 + g = find(g)+mxloc; + fg = [g(end) g(end)+1]; + pct68r = interp1([logl(fg)],CGobj{m}.mBinsDose(fg),pct68); + end + disp(['68% interval: ', num2str([pct68l, pct68r])]); + + % 95% + % left end point + g = find([logl(1:mxloc)] <= pct95); + if isempty(g) % the curve is above pct95 + pct95l = -1; + else % the curve climbed from below to above pct95 + fg = [g(end) g(end)+1]; + pct95l = interp1([logl(fg)],CGobj{m}.mBinsDose(fg),pct95); + end + % right end point + g = [logl(mxloc+1:end)] >= pct95; + if all(g) % the curve is above pct95 + pct95r = -1; + else % the curve slide down below pct95 + g = find(g)+mxloc; + fg = [g(end) g(end)+1]; + pct95r = interp1([logl(fg)],CGobj{m}.mBinsDose(fg),pct95); + end + disp(['95% interval: ', num2str([pct95l, pct95r])]); + + % h(t) for V20 and V30 + % V20 + figure(4); clf reset; hold on; + d = 20; + [~,f] = min(abs(CGobj{m}.mBinsDose - d)); + plot(allCox(f).h(:,1),allCox(f).h(:,2),'b'); + % V30 + d = 30; + [~,f] = min(abs(CGobj{m}.mBinsDose - d)); + plot(allCox(f).h(:,1),allCox(f).h(:,2),'r'); + set(gca,'xminortick','on','yminortick','on'); + + % response function for V20 +end + +% % check p-values at 30cc +% dose = 30; +% vol = 30; +% for m = 1:length(fn) + +% KM curve for (30Gy 71cc) +% search the p-values for Vx with x = 30 Gy +%dose = 30; +%vol = 71; +dose = 40; +vol = 30; +for m = 1:length(fn) + [~,fdose] = min(abs(CGobj{m}.mBinsDose - dose)); + f = cellfun(@(x) strcmpi('DVx',x),CGobj{m}.mLogRank(:,1)); + pvx = CGobj{m}.mLogRank{f,2}; + pvx = squeeze(pvx(fdose,:,:)); + f = pvx(:,6) < 2; + figure(m); clf reset; + semilogy(CGobj{m}.mBinsVol(f),pvx(f,5),'-','LineWidth',2); hold on; + semilogy(CGobj{m}.mBinsVol(f),0.05,'r-','LineWidth',1); + hold off; % grid on; + set(gca,'xminortick','on','yminortick','on'); + xlabel('Volume (cc)'); ylabel('p-value'); + % [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); + % disp(CGobj{m}.mBinsVol(fvol)); + % disp(pvx(fvol:fvol+5,:)); + + % compose complication KM curves + [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); + sa=classKaplanMeierCurve(); % initialize a survivalanalysis obj + CG = CGobj{m}; + % survival/complication time + f2 = ~cellfun('isempty',{CG.mGrp.mDateComp}); % patients with no complication date + f3 = ~cellfun('isempty',{CG.mGrp.mDateLastFollowup}); % patients with no last follow up date + compdate = inf(CG.mNumInGrp,1); + lastfollowup = inf(CG.mNumInGrp,1); + compdate(f2) = ([CG.mGrp(f2).mDateComp] - [CG.mGrp(f2).mDateBaseline])' / 30; + lastfollowup(f3) = ([CG.mGrp(f3).mDateLastFollowup] - [CG.mGrp(f3).mDateBaseline])' / 30; + compdate = min( lastfollowup, compdate ); + flgcensor = [CG.mGrp.mFlgCensor]'; + % Vx + vd=zeros(CG.mNumInGrp,1); % volume v at dose d + numstart=CG.mLogRankMinSize; + for d=fdose:fdose + % volume under d + vd(:)=0; + for k=1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose( CG.mBinsDose(d) ); + end + g=find(vd>-1); % non-zeros volume cases + + % median volume + % vol = median(vd); + [~,fvol] = min(abs(CGobj{m}.mBinsVol - vol)); + disp(CGobj{m}.mBinsVol(fvol)); + disp(pvx(fvol-2:fvol+2,:)); + + % (di,vj) + numend=length(g)-numstart; + for v=fvol:fvol + % check smaple size + flg_volbelow1=vd(g)<=CG.mBinsVol(v); f=length(find(flg_volbelow1)); % group DVHs by (d,v) + if fnumend % one group has too less patients, or the volume at the dose is too small, skip it + continue; + end + + % assign properties of object sa + survivedate={compdate(g(flg_volbelow1)); compdate(g(~flg_volbelow1))}; % survive time of each group + fcensor={flgcensor(g(flg_volbelow1)); flgcensor(g(~flg_volbelow1))}; % censor flag for each group + sa.mSurvivalTime=survivedate; + sa.mFlgCensor=fcensor; + % compute survival curves and compare them + sa=sa.fCalculateSurvivalCurve(); + sa=sa.fCombineSurvivalTime(); + sa=sa.fCompareSurvivalByLogrank(); + end + end + + % plot KM curves + figure(m); clf reset; hold on; % grid on; + stairs(sa.mSurvivalTimeSorted{1},1-sa.mSurvivalCurve{1}); + plot(sa.mSurvivalTimeSorted{1}(sa.mCensorStatistics{1}(:,1)),... + 1-sa.mSurvivalCurve{1}(sa.mCensorStatistics{1}(:,1)),'+'); + stairs(sa.mSurvivalTimeSorted{2},1-sa.mSurvivalCurve{2},'r'); + plot(sa.mSurvivalTimeSorted{2}(sa.mCensorStatistics{2}(:,1)),... + 1-sa.mSurvivalCurve{2}(sa.mCensorStatistics{2}(:,1)),'r+'); + % xticks = get(gca,'Xlim'); set(gca,'XTick',0:6:max(xticks)); + set(gca,'xminortick','on','yminortick','on'); + xlabel(['Months']); + ylabel(['Probability of CW Pain']); +end + +% p-values of medium line log-rank test +for m = 1:length(fn) + sa=classKaplanMeierCurve(); % initialize a survivalanalysis obj + CG = CGobj{m}; + % survival/complication time + f2 = ~cellfun('isempty',{CG.mGrp.mDateComp}); % patients with no complication date + f3 = ~cellfun('isempty',{CG.mGrp.mDateLastFollowup}); % patients with no last follow up date + compdate = inf(CG.mNumInGrp,1); + lastfollowup = inf(CG.mNumInGrp,1); + compdate(f2) = ([CG.mGrp(f2).mDateComp] - [CG.mGrp(f2).mDateBaseline])' / 30; + lastfollowup(f3) = ([CG.mGrp(f3).mDateLastFollowup] - [CG.mGrp(f3).mDateBaseline])' / 30; + compdate = min( lastfollowup, compdate ); + flgcensor = [CG.mGrp.mFlgCensor]'; + + dosebins = 0:max(CG.mBinsDose); + pvalues = zeros(length(dosebins),1); + vd = zeros(CG.mNumInGrp,1); + for n = 1:length(dosebins) + vd(:) = 0; + for k = 1:CG.mNumInGrp + vd(k) = CG.mGrp(k).fVolAtDose(dosebins(n)); + end + vm = median(vd); + flg_smallvol = vd0; +flgcensor = flgcensor(bmi_idx); + + + f = find(diff(hzrd(:,1))==0); % find duplicate time values of h(t) + while ~isempty(f) + hzrd(f,1) = hzrd(f,1)-eps*10; % adjust it a bit to avoid ambiguius + f = find(diff(hzrd(:,1))==0); % find duplicate time values of h(t) + end + +fig=figure(1); clf reset;hold on; +set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + + +grid on; +asympt_rates = zeros(length(splits),1); +raw_rates = zeros(length(splits),1); +cox_z = zeros(length(splits),1); + +[splits,split_idx] = sort(splits); +compdate = compdate(split_idx); +flgcensor = flgcensor(split_idx); +%splits = unique(splits); + +colors = varycolor(length(splits)); + +flg_split2=-1; +numstart=4; +numend=length(splits)-numstart; +skip_split = zeros(length(splits),1); +cur_color=1; +for i=1:length(splits) + + cur_split = splits(i); + + %flg_split=cur_split<=splits; + flg_split=splits<=cur_split; + f=length(find(flg_split)); + if fnumend % one group has too few patients, skip it + skip_split(i)=1; + continue; + end + if isequal(flg_split,flg_split2) % if it is the same grouping as previous, skip the computation and save the result directly + skip_split(i)=1; + continue; + end + + flg_split2=flg_split; + + [cur_b,~,cur_H,cur_stats] =... + coxphfit(flg_split,compdate,'baseline',0,'censoring',flgcensor); + + if cur_stats.p>0.05 + skip_split(i)=1; + continue; + end + + expbetax_above = 1; + expbetax_below = exp(cur_b); + cur_cic_above = 1-exp(-cur_H(:,2)*expbetax_above); + cur_cic_below = 1-exp(-cur_H(:,2)*expbetax_below); + + if cur_cic_below(end) > cur_cic_above(end) + skip_split(i)=1; + continue + end + + p=plot(cur_H(:,1), cur_cic_below,'b-',... + 'LineWidth',1); % high resolution Cox curve + set(p,'Color',colors(cur_color,:)); + + cur_color=cur_color+1; + + asympt_rates(i)=cur_cic_below(end); + %raw_rates(i)=mean(cur_cic_below); + raw_rates(i)=... + sum(flg_split(~flgcensor))/f; %number complications below split/total below split + + cox_z(i)=abs(cur_stats.z); + %cox_z(i)=abs(cur_stats.p); + + +end + splits(skip_split==1)=[]; + asympt_rates(skip_split==1)=[]; + raw_rates(skip_split==1)=[]; + cox_z(skip_split==1)=[]; + + + hold off; + title('Lower Cumulative CWP Incidence','FontSize',15); + set(gca,'xminortick','on','yminortick','on'); + set(gca,'box','on'); +xlabel('Month','FontSize',15); +ylabel('Probability of Complication','FontSize',15); + + + %% Lower rates vs split value +fig=figure(2); clf reset;hold on; +set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +grid on; +%h_asympt=plot(splits,asympt_rates,'b-.'); +[ax,h_rates,h_z] =plotyy([splits splits],[asympt_rates raw_rates],splits,cox_z); +set(get(ax(1),'Ylabel'),'String','Lower CWP Rate','FontSize',15); +%set(ax(1),'ylim',[0 0.3]); +set(get(ax(2),'Ylabel'),'String','Cox Z-value','FontSize',15); +%set(ax(2),'ylim',[0 7]); + +set(h_rates,'LineWidth',2) +set(h_z,'LineWidth',2) +h_lgnd=legend([h_rates;h_z],... + 'Asymptotic Incidence',... + 'Raw Incidence',... + 'Cox Z'); +xlabel('Split value','FontSize',15); +%ylabel('Lower CWP Rate','FontSize',15); +set(h_lgnd,'fontsize',14); +set(h_lgnd,'location','best'); + + %% Vd vs BMI +b_bmi = cur_bmi_beta; +b_vd = cur_vd_beta; + +fig=figure(5); clf reset;hold on; +set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +for j=1:length(splits) +% if skip_split(j) +% continue; +% end + bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + splits(j)/b_vd; + h_mid_pct=ezplot(bmi_vs_vd,[0,40]); + set(h_mid_pct,'Color',colors(j,:)); +end +title('Threshold for incidence in lower risk group','FontSize',15); +xlabel(['BMI'],'FontSize',15); +ylabel(['V_{99,a/b=2.1} [cc]'],'FontSize',15); +ylim([0 225]); +grid on; +hold off; + + + +%% Vd vs BMI with splits grouped by rate, and weigthed by z +% lower R <= 0.125 +% mid 0.125 > R <= 0.175 +% high R > 0.175 +low_raw_idx = raw_rates<=quantile(raw_rates,1/3); +mid_raw_idx = [raw_rates>quantile(raw_rates,1/3)].*... + [raw_rates<=quantile(raw_rates,2/3)]; +high_raw_idx = raw_rates>quantile(raw_rates,2/3); + +low_splits = splits(low_raw_idx==1); +se_low_splits = std(low_splits)/sqrt(length(low_splits)); +low_splits=low_splits.*cox_z(low_raw_idx==1); +mean_low_splits=sum(low_splits)/sum(cox_z(low_raw_idx==1)); +low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + mean_low_splits/b_vd; +low_low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_low_splits-se_low_splits)/b_vd; +low_high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_low_splits+se_low_splits)/b_vd; + +%mid_idx = [asympt_rates>0.125].*[asympt_rates<=0.175]; + + +mid_splits = splits(mid_raw_idx==1); +se_mid_splits = std(mid_splits)/(sqrt(length(mid_splits))); +mid_splits=mid_splits.*cox_z(mid_raw_idx==1); +mean_mid_splits=sum(mid_splits)/sum(cox_z(mid_raw_idx==1)); +mid_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + mean_mid_splits/b_vd; +mid_low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_mid_splits-se_mid_splits)/b_vd; +mid_high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_mid_splits+se_mid_splits)/b_vd; + + +%high_idx = asympt_rates>0.175; + + +high_splits = splits(high_raw_idx==1); +se_high_splits = std(high_splits)/sqrt(length(high_splits)); +high_splits=high_splits.*cox_z(high_raw_idx==1); +mean_high_splits=sum(high_splits)/sum(cox_z(high_raw_idx==1)); +high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + mean_high_splits/b_vd; +high_low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_high_splits-se_high_splits)/b_vd; +high_high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... + (mean_high_splits+se_high_splits)/b_vd; + + +fig=figure(6); clf reset;hold on; +set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_low_pct=ezplot(low_bmi_vs_vd,[0,40]); +set(h_low_pct,'Color','g'); +set(h_low_pct,'LineWidth',2); +h_low_low_pct=ezplot(low_low_bmi_vs_vd,[0,40]); +set(h_low_low_pct,'Color','g'); +set(h_low_low_pct,'LineStyle',':'); +h_low_high_pct=ezplot(low_high_bmi_vs_vd,[0,40]); +set(h_low_high_pct,'Color','g'); +set(h_low_high_pct,'LineStyle',':'); + +h_mid_pct=ezplot(mid_bmi_vs_vd,[0,40]); +set(h_mid_pct,'Color','b'); +set(h_mid_pct,'LineWidth',2); +h_mid_low_pct=ezplot(mid_low_bmi_vs_vd,[0,40]); +set(h_mid_low_pct,'Color','b'); +set(h_mid_low_pct,'LineStyle',':'); +h_mid_high_pct=ezplot(mid_high_bmi_vs_vd,[0,40]); +set(h_mid_high_pct,'Color','b'); +set(h_mid_high_pct,'LineStyle',':'); + +h_high_pct=ezplot(high_bmi_vs_vd,[0,40]); +set(h_high_pct,'Color','r'); +set(h_high_pct,'LineWidth',2); +h_high_low_pct=ezplot(high_low_bmi_vs_vd,[0,40]); +set(h_high_low_pct,'Color','r'); +set(h_high_low_pct,'LineStyle',':'); +h_high_high_pct=ezplot(high_high_bmi_vs_vd,[0,40]); +set(h_high_high_pct,'Color','r'); +set(h_high_high_pct,'LineStyle',':'); + + +ylim([0 160]); +%ylim([0 210]); +title(['Threshold for raw incidence in lower risk group',10,... + 'Weighted by Cox z-values, errors \pm 1 S.E.'],'FontSize',15); +xlabel(['BMI'],'FontSize',15); +ylabel(['V_{99,a/b=2.1} [cc]'],'FontSize',15); +grid on; + +lgnd=legend([h_low_pct h_mid_pct h_high_pct],... + ['R_{raw} \leq ',num2str(quantile(raw_rates,1/3)*100,3),'%'],... + [num2str(quantile(raw_rates,1/3)*100,3),'% < R_{raw} \leq ',... + num2str(quantile(raw_rates,2/3)*100,3),'%'],... + ['R_{raw} > ',num2str(quantile(raw_rates,2/3)*100,3),'%']); + +set(lgnd,'fontsize',14); +set(lgnd,'location','best'); + %% vd vs bmi + +fig=figure(3); clf reset;hold on; +%set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +[n_low,x_low]=hist(raw_rates(low_raw_idx==1),0:0.01:0.3); +bar(x_low,n_low,'g'); + +[n_mid,x_mid]=hist(raw_rates(mid_raw_idx==1),0:0.01:0.3); +bar(x_mid,n_mid,'b'); + +[n_high,x_high]=hist(raw_rates(high_raw_idx==1),0:0.01:0.3); +bar(x_high,n_high,'r'); + +xlim([0 0.32]); +xlabel('Lower raw CWP incidence','FontSize',15); +ylabel('Frequency','FontSize',15); + + +% % asympt +% fig=figure(7); clf reset;hold on; +% %set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +% [n_low,x_low]=hist(asympt_rates(low_idx==1),0:0.01:0.3); +% bar(x_low,n_low,'g'); +% +% [n_mid,x_mid]=hist(asympt_rates(mid_idx==1),0:0.01:0.3); +% bar(x_mid,n_mid,'b'); +% +% [n_high,x_high]=hist(asympt_rates(high_idx==1),0:0.01:0.3); +% bar(x_high,n_high,'r'); +% +% xlim([0 0.32]); +% xlabel('Lower asymptotic CWP incidence','FontSize',15); +% ylabel('Frequency','FontSize',15); + + + +%% See raw < 10 % and asympt < 10% +% find best split for 9%0.09].*[raw_rates<0.11]; +%[raw_mx_z_10pct,~] = max(cox_z(raw_10pct_idx==1)); +%raw_mx_z_idx = find(cox_z==raw_mx_z_10pct); +%raw_10pct_split = splits(raw_mx_z_idx); +raw_10pct_split = max(splits(raw_10pct_idx==1)); +raw_10pct_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + raw_10pct_split/b_vd; + +asympt_10pct_idx = [asympt_rates>0.09].*[asympt_rates<0.11]; +%[asympt_mx_z_10pct,~] = max(cox_z(asympt_10pct_idx==1)); +%asympt_mx_z_idx = find(cox_z==asympt_mx_z_10pct); +%asympt_10pct_split = splits(asympt_mx_z_idx); + +asympt_10pct_split = max(splits(asympt_10pct_idx==1)); +asympt_10pct_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + asympt_10pct_split/b_vd; + + +fig=figure(8); clf reset;hold on; +set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +h_raw_10pct=ezplot(raw_10pct_bmi_vs_vd,[0,40]); +set(h_raw_10pct,'Color','r'); +set(h_raw_10pct,'LineWidth',2); +h_asympt_10pct=ezplot(asympt_10pct_bmi_vs_vd,[0,40]); +set(h_asympt_10pct,'Color','b'); +set(h_asympt_10pct,'LineWidth',2); + +ylim([0 125]); +title('Max V_{99} threshold for 10% incidence in lower risk group',... + 'FontSize',15); +xlabel(['BMI'],'FontSize',15); +ylabel(['V_{99,a/b=2.1} [cc]'],'FontSize',15); +grid on; + +lgnd=legend([h_raw_10pct h_asympt_10pct],... + ['R_{raw} \leq 10%'],... + ['R_{asympt} \leq 10%']); +set(lgnd,'fontsize',14); +set(lgnd,'location','best'); + + +% +% raw_10pct_idx = raw_rates<=0.1; +% asympt_10pct_idx = asympt_rates<=0.1; +% +% +% raw_10pct_splits = splits(raw_10pct_idx==1); +% se_raw_10pct_splits = std(raw_10pct_splits)/sqrt(length(raw_10pct_splits)); +% raw_10pct_splits=raw_10pct_splits.*cox_z(raw_10pct_idx==1); +% mean_raw_10pct_splits=sum(raw_10pct_splits)/sum(cox_z(raw_10pct_idx==1)); +% +% raw_10pct_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + mean_raw_10pct_splits/b_vd; +% raw_10pct_low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... +% (mean_raw_10pct_splits-se_raw_10pct_splits)/b_vd; +% raw_10pct_high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... +% (mean_raw_10pct_splits+se_raw_10pct_splits)/b_vd; +% +% asympt_10pct_splits = splits(asympt_10pct_idx==1); +% se_asympt_10pct_splits = std(asympt_10pct_splits)/sqrt(length(asympt_10pct_splits)); +% asympt_10pct_splits=asympt_10pct_splits.*cox_z(asympt_10pct_idx==1); +% mean_asympt_10pct_splits=sum(asympt_10pct_splits)/sum(cox_z(asympt_10pct_idx==1)); +% +% asympt_10pct_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x + mean_asympt_10pct_splits/b_vd; +% asympt_10pct_low_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... +% (mean_asympt_10pct_splits-se_asympt_10pct_splits)/b_vd; +% asympt_10pct_high_bmi_vs_vd = @(x) (-b_bmi/b_vd)*x +... +% (mean_asympt_10pct_splits+se_asympt_10pct_splits)/b_vd; +% +% +% fig=figure(8); clf reset;hold on; +% set(fig,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +% +% +% +% h_raw_10pct=ezplot(raw_10pct_bmi_vs_vd,[0,40]); +% set(h_raw_10pct,'Color','r'); +% set(h_raw_10pct,'LineWidth',2); +% h_raw_10pct_low=ezplot(raw_10pct_low_bmi_vs_vd,[0,40]); +% set(h_raw_10pct_low,'Color','r'); +% set(h_raw_10pct_low,'LineStyle',':'); +% h_raw_10pct_high=ezplot(raw_10pct_high_bmi_vs_vd,[0,40]); +% set(h_raw_10pct_high,'Color','r'); +% set(h_raw_10pct_high,'LineStyle',':'); +% +% h_asympt_10pct=ezplot(asympt_10pct_bmi_vs_vd,[0,40]); +% set(h_asympt_10pct,'Color','b'); +% set(h_asympt_10pct,'LineWidth',2); +% h_asympt_10pct_low=ezplot(asympt_10pct_low_bmi_vs_vd,[0,40]); +% set(h_asympt_10pct_low,'Color','b'); +% set(h_asympt_10pct_low,'LineStyle',':'); +% h_asympt_10pct_high=ezplot(asympt_10pct_high_bmi_vs_vd,[0,40]); +% set(h_asympt_10pct_high,'Color','b'); +% set(h_asympt_10pct_high,'LineStyle',':'); +% +% +% ylim([0 95]); +% title(['Threshold for 10%raw/asymptotic incidence in lower risk group',10,... +% 'Weighted by Cox z-values, errors \pm 1 S.E.'],'FontSize',15); +% xlabel(['BMI'],'FontSize',15); +% ylabel(['V_{99,a/b=2.1} [cc]'],'FontSize',15); +% grid on; +% +% lgnd=legend([h_raw_10pct h_asympt_10pct],... +% ['R_{raw} \leq 10%'],... +% ['R_{asympt} \leq 10%']); +% set(lgnd,'fontsize',14); +% set(lgnd,'location','best'); + + + + end \ No newline at end of file diff --git a/ChestWallVolumes.m b/ChestWallVolumes.m new file mode 100755 index 0000000..3302814 --- /dev/null +++ b/ChestWallVolumes.m @@ -0,0 +1,280 @@ +function ChestWallVolumes +tic; +% prepare +fp = 'Z:\elw\MATLAB\cw_analy\meta_data\'; +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fn ='MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_ratio0.mat'; + +screen_size=get(0,'ScreenSize'); + +load(strcat(fp,fn),'CGobj_current'); + +V30s=zeros(CGobj_current.mNumInGrp,1); +dates=zeros(CGobj_current.mNumInGrp,1); +outcomes=zeros(CGobj_current.mNumInGrp,1); +for k=1:CGobj_current.mNumInGrp + V30s(k) = CGobj_current.mGrp(k).fVolAtDose( 30 ); + dates(k) = CGobj_current.mGrp(k).mDateStartTx; + outcomes(k) = CGobj_current.mGrp(k).mFlgCensor; +end + + +[sorted_dates,idx]=sort(dates); +sorted_v30s = V30s(idx); +sorted_outcomes = outcomes(idx); +sorted_comps = ~sorted_outcomes; + +date_range = sorted_dates(end)-sorted_dates(1); +date_width = date_range/39; +binned_dates = sorted_dates+repmat(date_width,[length(sorted_dates) 1]); +binned_comps = histc(sorted_dates(sorted_comps),binned_dates); + + +% figure(200); +% plot(binned_dates,binned_comps,'o'); +% ylabel('Complications/60 days','fontsize',18); +% xlabel('Months','fontsize',18); +% xlim([min(sorted_dates),max(sorted_dates)]); +% datetick('x','mmm/yy','keepticks'); +% + + +tot_comp = zeros(length(sorted_dates),1); +tot_pts = [1:length(sorted_dates)]'; + +for i=1:length(sorted_outcomes) %loop over each date + if i==1 + tot_comp(i)= sorted_comps(i); + else + tot_comp(i)=tot_comp(i-1)+sorted_comps(i); + end +end + +% f2=figure(2); +% set(f2,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +% plot(sorted_dates,tot_comp./tot_pts,'LineWidth',2); +% +% h_ln(1)=line([datenum('07/30/2009') datenum('07/30/2009')],[0 1],... +% 'Color','g',... +% 'LineWidth',2,... +% 'LineStyle','--'); +% h_ln(3)=line([datenum('01/01/2011') datenum('01/01/2011')],[0 1],... +% 'Color','b',... +% 'LineWidth',2,... +% 'LineStyle','--'); +% h_ln(2)=line([datenum('05/01/2010') datenum('05/01/2010')],[0 1],... +% 'Color','r',... +% 'LineWidth',2,... +% 'LineStyle','--'); +% legend(h_ln,'July 30, 2009','May 1, 2010','Jan 1, 2011'); +% +% datetick('x','mmm/yy','keepticks'); +% set(gca,'FontSize',12); +% ylabel('Cumulative incidence rate','FontSize',18); +% xlabel('Tx start date','fontsize',18); +% xlim([min(sorted_dates),max(sorted_dates)]); +% ylim([0 1]); + + +% Get median v30s before/after cut + +v30_jan_cut_date='01/01/2011'; +v30_jan_cut_date=datenum(v30_jan_cut_date); +v30_bc_jan = sorted_dates=2 Gd RP before Jan11: ',num2str(bc_jan_rate,4)]); + +% after +ac_jan_v30s = sorted_v30s(~v30_bc_jan); +ac_jan_mdn = median(ac_jan_v30s); + +ac_jan_comps = sum(~sorted_outcomes(~v30_bc_jan)); +ac_jan_outcomes = length(sorted_outcomes(~v30_bc_jan)); +ac_jan_rate = ac_jan_comps/ac_jan_outcomes; +disp(['Rate of >=2 Gd RP after Jan11: ',num2str(ac_jan_rate,4)]); + +%may +v30_may_cut_date='05/01/2010'; +v30_may_cut_date=datenum(v30_may_cut_date); +v30_bc_may = sorted_dates=2 Gd RP before May11: ',num2str(bc_may_rate,4)]); + +ac_may_v30s = sorted_v30s(~v30_bc_may); +ac_may_mdn = median(ac_may_v30s); + +ac_may_comps = sum(~sorted_outcomes(~v30_bc_may)); +ac_may_outcomes = length(sorted_outcomes(~v30_bc_may)); +ac_may_rate = ac_may_comps/ac_may_outcomes; +disp(['Rate of >=2 Gd RP after May11: ',num2str(ac_may_rate,4)]); + + + +% sept +disp(['Sept 2010']); +v30_sept_cut_date='09/01/2010'; +v30_sept_cut_date=datenum(v30_sept_cut_date); +v30_bc_sept = sorted_dates=2 Gd RP before Sept10: ',num2str(bc_sept_rate,4)]); + +%after + +ac_sept_v30s = sorted_v30s(~v30_bc_sept); +ac_sept_mdn = median(ac_sept_v30s); + +ac_sept_comps = sum(~sorted_outcomes(~v30_bc_sept)); +ac_sept_outcomes = length(sorted_outcomes(~v30_bc_sept)); +ac_sept_rate = ac_sept_comps/ac_sept_outcomes; + + + +disp(['Rate of >=2 Gd RP after Sept10: ',num2str(ac_sept_rate,4)]); +disp(['']); +disp(['Median V30 before Sept10: ',num2str(bc_sept_mdn,4)]); +disp(['Median V30 after Sept10: ',num2str(ac_sept_mdn,4)]); + + +%bc_v30s(bc_v30s==0)=[]; + +hold on; +f1=figure(1); +set(f1,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +h(1)=plot(sorted_dates,sorted_v30s,'k'); +set(gca,'FontSize',12); + +xlim([min(sorted_dates),max(sorted_dates)]); +ylabel('Lung volume that received >= 30 Gy [cc]','fontsize',18); +xlabel('Tx start date','fontsize',18); +%set(gca,'XTick',sorted_dates); + +h(3)=plot(sorted_dates,repmat(70,length(sorted_dates),1),'g-.','LineWidth',3); + +h(4)=plot(sorted_dates(v30_bc_jan),repmat(bc_jan_mdn,length(sorted_dates(v30_bc_jan)),1),'b:','LineWidth',5); +h(5)=plot(sorted_dates(~v30_bc_jan),repmat(ac_jan_mdn,length(sorted_dates(~v30_bc_jan)),1),'b--','LineWidth',3); + +h(6)=plot(sorted_dates(v30_bc_may),repmat(bc_may_mdn,length(sorted_dates(v30_bc_may)),1),'r:','LineWidth',5); +h(7)=plot(sorted_dates(~v30_bc_may),repmat(ac_may_mdn,length(sorted_dates(~v30_bc_may)),1),'r--','LineWidth',3); + +numBins=78; +binEdges = linspace(min(sorted_dates),max(sorted_dates),numBins+1); + + + +[~,whichBin] = histc(sorted_dates,binEdges); + + +for i=1:numBins + flagBinMembers = (whichBin==i); + binMembersV30 = sorted_v30s(flagBinMembers); + binMembersDate = sorted_dates(flagBinMembers); + binMeanV30(i) = mean(binMembersV30); + binMeanDate(i) = mean(binMembersDate); + +end +wideBinEdges = linspace(min(sorted_dates),max(sorted_dates),(numBins/2)+1); +[~,wideWhichBin] = histc(sorted_dates,wideBinEdges); +binNumPts = zeros(numBins/2,1); +for j=1:(numBins/2) + flagWideBinMembers = (wideWhichBin==j); + + wideBinMembersDate = sorted_dates(flagWideBinMembers); + binOutcomeDate(j)=mean(wideBinMembersDate); + binOutcomes = sum(sorted_outcomes(flagWideBinMembers))+sum(~sorted_outcomes(flagWideBinMembers)); + binComps = sum(~sorted_outcomes(flagWideBinMembers)); + binCompRate(j) = binComps/binOutcomes; + if j==1 + binNumPts(j) = binOutcomes; + else + binNumPts(j) = binNumPts(j-1)+binOutcomes; + end +end + +binCompRate(isinf(binCompRate))=0; + +h(2)=plot(binMeanDate,binMeanV30,'m-','LineWidth',1.5); +yL = get(gca,'YLim'); + +line([datenum('05/01/2010') datenum('05/01/2010')],yL,... + 'Color','r',... + 'LineStyle','--'); +line([datenum('01/01/2011') datenum('01/01/2011')],yL,... + 'Color','b',... + 'LineStyle','--'); + +datetick('x','mmm/yy','keepticks'); + +lgnd=legend([h(2) h(3) h(6) h(7) h(4) h(5)], 'Avg./~month','70 cc',... + strcat('Pre May10 (',num2str(bc_may_mdn,3),' cc)'),... + strcat('Post May10 (',num2str(ac_may_mdn,3),' cc)'),... + strcat('Pre Jan11 (',num2str(bc_jan_mdn,3),' cc)'),... + strcat('Post Jan11 (',num2str(ac_jan_mdn,3),' cc)'),... + 'Location','NorthEast'); +set(lgnd,'FontSize',12); + +f100=figure(100); +set(f100,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); +%plot(binOutcomeDate,binCompRate,'-o','LineWidth',2); +% plot(binOutcomeDate,binNumPts,'-o','LineWidth',2); +% ylabel('Complication Rate/60 days','fontsize',18); +% xlabel('Months','fontsize',18); +% xlim([sorted_dates(1),sorted_dates(end)]); +% set(gca,'XTick',linspace(sorted_dates(1),sorted_dates(end),18)); + +[AX,H1,H2]=plotyy(binOutcomeDate,binCompRate,binOutcomeDate,binNumPts,'plot'); +axes(AX(1)); +ylabel('Complication Incidence / 60 days','fontsize',16); +xlim([sorted_dates(1),sorted_dates(end)]); +datetick('x','mmm/yy','keepticks','keeplimits'); +axes(AX(2)); +ylabel('Cumulative Total Number of Patients','fontsize',16); +xlim([sorted_dates(1),sorted_dates(end)]); +datetick('x','mmm/yy','keepticks','keeplimits'); + + +yL = get(gca,'YLim'); +l_jan2011=line([datenum('01/01/2011') datenum('01/01/2011')],yL,... + 'Color','k',... + 'LineWidth',2,... + 'LineStyle','--'); +l_jan2010=line([datenum('01/01/2010') datenum('01/01/2010')],yL,... + 'Color','r',... + 'LineWidth',2,... + 'LineStyle','--'); +l_sept2010=line([datenum('09/01/2010') datenum('09/01/2010')],yL,... + 'Color','g',... + 'LineWidth',2,... + 'LineStyle','--'); +l_aug2009=line([datenum('07/30/2009') datenum('07/30/2009')],yL,... + 'Color','m',... + 'LineWidth',2,... + 'LineStyle','--'); + +h_lgnd=legend([l_aug2009 l_jan2010 l_sept2010 l_jan2011],'July 30 2009','Jan 1 2010','Sept 1 2010','Jan 1 2011'); +set(h_lgnd,'FontSize',14); + +end \ No newline at end of file diff --git a/DVHFromText_batch.m b/DVHFromText_batch.m new file mode 100755 index 0000000..f06805a --- /dev/null +++ b/DVHFromText_batch.m @@ -0,0 +1,225 @@ +function DVHFromText_batch +% DVH is saved in 3 cell columns, the first stores the patient name, +% the second the original dose, original differential volume, cumulative volume from oriignal diffirential volume +% the third the resampled dose, differential volume, and cumulative volume + +tic; +% parameters +pt_added=0; + +dose_step=0.50; + +% path and files +%pathname='Z:/elw/MATLAB/original_data/CW/CWPAIN_MASTER_DATASET_01_10_13'; +pathname='Z:/elw/MATLAB/original_data/CW/CWPAIN_DATASET_01_17_13 (CW DISTANCE)'; + + + +if isunix + % try + % [xlsnum,xlstxt,xlsraw]=xlsread(pathname); + % save(pathname,'xlsraw'); + % catch + pathname=strrep(pathname,'G:','/media/SKI_G'); + load(pathname); + % end +else + [~,~,xlsraw]=xlsread(pathname); + %convert all mrns to strings + save(pathname,'xlsraw'); +end + +%tmp +pathname='Z:/elw/MATLAB/original_data/CW/DVHs/'; +%pathname='Z:/elw/MATLAB/original_data/CW/'; +fnSuffix='_2cmExp.TXT'; + +% load DVH names in d +d=dir(pathname); +if isempty(d) + disp(['!! Bad DVH location name', pathname]); + return +end + +f=false(size(d,1),1); +for k=1:size(d,1) + if isempty(findstr(d(k).name,'.TXT')) || isdir(d(k).name) + f(k)=true; + end +end +d(f)=[]; +dvh_file_names = {d.name}'; +% patient last name +f=cellfun(@(x) strcmp(x,'Patient Last Name'),xlsraw(1,:)); f=find(f); f=f(1); % found the column of "Patient Last Name" +ptnames=xlsraw(2:end,f); % patient last name + +% Treatment site (use to find correct DVH file for duplicate entries) +g=cellfun(@(x) strcmp(x,'Treatment Site'),xlsraw(1,:)); g=find(g); g=g(1); % found the column of "Patient Last Name" +txsites=xlsraw(2:end,g); + +g=cellfun(@(x) strcmp(x,'MRN'),xlsraw(1,:)); g=find(g); g=g(1); % found the column of "MRN" +mrns=xlsraw(2:end,g); + +% convert all mrn data to strings +containsNumbers = cellfun(@isnumeric,mrns); +mrns(containsNumbers) = cellfun(@num2str,mrns(containsNumbers),'UniformOutput',false); +orig_mrns=mrns; +mrns=regexprep(mrns,'-.',''); +% strip + +% read data from each .TXT file +DVH=cell(size(ptnames,1),4); flg_nofile=false(size(ptnames,1),1); +disp(' '); +for k=1:size(ptnames,1) + % find the patient in the xls spreadsheet + %f=cellfun(@(x) strcmp(x,ptnames{k}), ptnames); f=find(f); + f=cellfun(@(x) strcmp(x,mrns{k}), mrns); f=find(f); + + ptname=ptnames{k}; + mrn=mrns(k); + % remove any '-' from mrn + dash_ind = strfind(mrn,'-'); + if ~isempty(dash_ind{1}), + mrn = mrn{1}(1:dash_ind{1}-1); + else + mrn=mrn{1}; + end + + dvh_file_name = strcat(ptname,'_',mrn); + + if length(f)>1 + %disp(['repeated last names: ',ptnames{k}]); + if length(f)>2 + disp([ptnames{k},' repeated ',num2str(length(f)),' times, quitting...']); + end + + loc_str = CWLocationString(ptname,txsites{k}); + + dvh_file_name = strcat(dvh_file_name,'_',loc_str); + end + % No duplicates, look up DVH with last name and MRN, strip any extra '-' first + + + cur_dvh = strfind(dvh_file_names,dvh_file_name); + + dvh_name=dvh_file_names{~cellfun(@isempty,cur_dvh)}; + + + dvh_loc = strcat(pathname,dvh_name); + + disp(['Loading ',dvh_loc,'...']); + + % original DVH + try + %df=textread(strcat(pathname,ptnames{k},fnSuffix),'%s'); % read the file into cells df (data from file) + df=textread(dvh_loc,'%s'); % read the file into cells df (data from file) + catch ME + disp(strcat(pathname,ptnames{k},fnSuffix)); disp(ME.message); + % for errcount=1:length(ME.stack) + % disp(ME.stack(errcount)); + % end + flg_nofile(k)=true; continue; + end + + DVH{k,1}=ptnames{k}; + DVH{k,4}=orig_mrns{k}; + + df(1)=[]; % the first cell is the description text of the data, remove it + data=cellfun(@(x) str2num(x), df); + + % original DVH as step function + dose_org=data(1:4:end)/100; vol_org=data(2:4:end); % /100 to change cGy to Gy + % cumulative dvh + vol_cumulative=vol_org; + % vol_cumulative(1:end-1)=vol_cumulative(1:end-1).*diff(dose_org); + vol_cumulative=flipud(vol_cumulative); vol_cumulative=cumsum(vol_cumulative); vol_cumulative=flipud(vol_cumulative); + DVH{k,2}=[dose_org,vol_org,vol_cumulative]; + + % regenerate the differentail DVH by adding new bins (which is the expected bins) + dose_interpolation=(0:dose_step:max(DVH{k,2}(:,1))+dose_step)'; % locations of new bins + vol_interpolation=zeros(size(dose_interpolation,1),1); + f=ismember(dose_interpolation, dose_org); % the doses alreadyin the original dose vector should be removed in new bins + dose_interpolation(f)=[]; vol_interpolation(f)=[]; + dose_new=[dose_org; dose_interpolation]; % add the new bins and sort it so new bins and old ones are arranged properly + vol_new=[vol_org; vol_interpolation]; + [dose_new,g]=sort(dose_new); vol_new=vol_new(g); + for n=1:size(dose_interpolation,1)-1 % the end point can not be interpolated, and should be zero since the last dose "bin" should correspond no volume + f=find(dose_interpolation(n)>dose_new); % the location of interpolated dose in the DVH with combined bins, which is applied to determine the left end point (d(i-1)), d(i-1)=f(end) + g=find(dose_interpolation(n)dose_new); % the range of new bins in the interpolated bin + vol_interpolation(n) = sum(vol_new(f)); + end + % cumulative dvh + vol_cumulative=vol_interpolation;% vol_cumulative(1:end-1)=vol_cumulative(1:end-1).*diff(dose_interpolation); + vol_cumulative=flipud(vol_cumulative); vol_cumulative=cumsum(vol_cumulative); vol_cumulative=flipud(vol_cumulative); + DVH{k,3}=[dose_interpolation,vol_interpolation,vol_cumulative]; + + + % % look up volume at each new step from original step function + % dose_interpolation=(0:dose_step:max(DVH{k,2}(:,1))+dose_step)'; % ((0:(ceil(max(DVH{k,1}(:,1))/dose_step)))*dose_step)'; + % vol_interpolation=zeros(size(dose_interpolation,1),1); + % for n=1:size(dose_interpolation,1) + % f=find(dose_interpolation(n)>=dose_org); + % vol_interpolation(n)=vol_org(f(end)); + % end + % % combine the new step function with the original one + % dose_new=[dose_org;dose_interpolation]; vol_new=[vol_org; vol_interpolation]; + % [dose_new,f]=sort(dose_new); vol_new=vol_new(f); + % f=diff(dose_new); dose_new(f==0)=[]; vol_new(f==0)=[]; % remove duplicate records in the new step function + % % interpolation according to equivalent area + % vol_new=vol_new.*([diff(dose_new);0]); % area of each bin (step forward) + % vol_new(2:end)=vol_new(1:end-1); vol_new(1)=0; % area of each bin (step backward) + % vol_new=cumsum(vol_new); % cumulative area of the bins + % for n=1:size(dose_interpolation,1) + % f = find( dose_interpolation(n)>=dose_new ); % the cumulative interval of the new bin + % vol_interpolation(n)=vol_new(f(end)); % the cumulative bin + % end + % vol_interpolation(1:end-1)=diff(vol_interpolation)./diff(dose_interpolation); vol_interpolation(end)=0; % the new bin (step forward due to the diff function) + % % cumulative dvh + % vol_cumulative=vol_interpolation; vol_cumulative(1:end-1)=vol_cumulative(1:end-1).*diff(dose_interpolation); + % vol_cumulative=flipud(vol_cumulative); vol_cumulative=cumsum(vol_cumulative); vol_cumulative=flipud(vol_cumulative); + % DVH{k,3}=[dose_interpolation,vol_interpolation,vol_cumulative]; + + % plot the result + figure(1); a=data(1:2:end)/100; b=data(2:2:end); plot(a,b); hold on; + stairs(DVH{k,2}(:,1),DVH{k,2}(:,2),'r'); + stairs(DVH{k,3}(:,1),DVH{k,3}(:,2),'k'); + % a=DVH{k,2}(:,1); b=DVH{k,2}(:,2); a=[a,a]';a=a(:); a(1)=[]; b=[b,b]'; b=b(:);b(end)=[]; plot(a,b,'r'); + % a=DVH{k,3}(:,1); b=DVH{k,3}(:,2); a=[a,a]';a=a(:); a(1)=[]; b=[b,b]'; b=b(:);b(end)=[]; plot(a,b,'k'); + % a=dose_interpolation; b=vol_interpolation; a=[a,a]';a=a(:); a(1)=[]; b=[b,b]'; b=b(:);b(end)=[]; plot(a,b,'r'); + % plot(dose_interpolation,vol_interpolation,'k'); + grid on; title([ptnames{k}, ' ',num2str(k)]); hold off; + + figure(2); stairs(DVH{k,2}(:,1),DVH{k,2}(:,3)); hold on; + stairs(DVH{k,3}(:,1),DVH{k,3}(:,3),'r'); hold off; + grid on; pause(0); + pt_added=pt_added+1; +end +% DVH(flg_nofile,:)=[]; % remove no file patients +% save result + + fn='Z:\elw\MATLAB\cw_analy\meta_data\CW_MASTER_DVHs.mat'; + + +if isunix + fn=strrep(fn,'G:','/media/SKI_G'); +end + +if 0 + disp(['Saving ',fn]); + save(fn); +end + +disp(' '); + +disp(['total number of patients in .xls file: ',num2str(pt_added)]); +disp(['total number of patients with the DVH files: ', num2str(sum(~flg_nofile))]); +disp(['total number of patients without the DVH files: ', num2str(sum(flg_nofile))]); +toc; \ No newline at end of file diff --git a/DataFromCW.m b/DataFromCW.m new file mode 100755 index 0000000..0cb5f79 --- /dev/null +++ b/DataFromCW.m @@ -0,0 +1,43 @@ +function DataFromCW % extracting for MD analysis +tic; +% parameters + dvhdef={'2cmExp';'Colorado'}; + CG = cell(length(dvhdef),1); + +% load data + for k = 1:length(dvhdef) + fn=['G:/MSKCC/Andy/Ken/tom/CW_',dvhdef{k},'.mat']; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + load(fn,'CGobj'); + CG{k} = CGobj; + end + +% extract V20 and V30 + Dose = [20; 30]; + for k = 1:length(dvhdef) + % extract data + vx = zeros(CGobj.mNumInGrp,length(Dose)); + for n = 1:length(Dose) + for m = 1:CGobj.mNumInGrp + vx(m,n) = CG{k}.mGrp(m).fVolAtDose(Dose(n)); + end + end + % write to excel file + d = cell(CGobj.mNumInGrp+1,length(Dose)+1); + d{1,1} = 'Pt Code'; + for n = 1:length(Dose) + d{1,n+1} = ['V',num2str(Dose(n))]; + end + d(2:end,1) = {CGobj.mGrp.mID}; + d(2:end,2:length(Dose)+1) = num2cell(vx); + + fn=['G:/MSKCC/Andy/Ken/tom/CW_Vx_',dvhdef{k},'.xls']; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + xlswrite(fn,d,dvhdef{k}); + end +toc; +end \ No newline at end of file diff --git a/DebugChestWallData.m b/DebugChestWallData.m new file mode 100755 index 0000000..ff4f25a --- /dev/null +++ b/DebugChestWallData.m @@ -0,0 +1,86 @@ +function DebugChestWallData +tic; + +[~,~,comparision_data]=xlsread('Z:\elw\MATLAB\original_data\CW\CWPAIN_DATASET_OLDNEW_RP_COMPARISION.xlsx'); + +pt_name = comparision_data(2:end,2); + +mutter_rp2 = comparision_data(:,12); +mutter_rp2 = mutter_rp2(2:end); + +mutter_rp2_outcome = ones(size(mutter_rp2)); +mutter_rp2_date = zeros(size(mutter_rp2)); +for i=1:length(mutter_rp2_outcome); + + if isempty(mutter_rp2{i}), + mutter_rp2_outcome(i)=0; + else + mutter_rp2_date(i)=datenum(mutter_rp2{i}); + end +end + + +rimner_rp2 = comparision_data(:,17); +rimner_rp2 = rimner_rp2(2:end); + +rimner_rp2_outcome = ones(size(rimner_rp2)); +rimner_rp2_date = zeros(size(rimner_rp2)); +for i=1:length(rimner_rp2_outcome); + + if isnan(rimner_rp2{i}), + rimner_rp2_outcome(i)=0; + else + rimner_rp2_date(i)=datenum(rimner_rp2{i}); + end +end + + + +mutter_fu_date = comparision_data(:,19); +mutter_fu_date = mutter_fu_date(2:end); +mutter_fu_date= datenum(mutter_fu_date); + +%% find problems + + + +rim_minus_mutt = rimner_rp2_outcome-mutter_rp2_outcome; + +comp_date_diff_n=0; +for j=1:length(rim_minus_mutt) + cur_diff = rim_minus_mutt(j); + + %find problems + if (cur_diff == 0), + if (rimner_rp2_outcome(j)==1), + %both have gd2 comp, check that dates are the same + if rimner_rp2_date(j)~=mutter_rp2_date(j), + comp_date_diff_n=comp_date_diff_n+1; + +% disp(['-']); +% disp(['Comp dates differ for:']); +% disp([pt_name{j},... +% ' -> R: ',datestr(rimner_rp2_date(j)),... +% ' -> M: ',datestr(mutter_rp2_date(j))]); + end + end + elseif (cur_diff > 0), % new data has complication, old doesn't + %make sure that rimner_rp2_date > mutter_date_last_fu + if rimner_rp2_date(j)length(vds)-2, + cur_i=cur_i+1; + continue; + end + + % Cox HR for split + cox_beta=coxphfit(~flg_volbelow,compdate,'baseline',0,'censoring',flgcensor); + cox_hr = exp(cox_beta); + + % assign properties of object sa + survivedate={compdate(flg_volbelow); compdate(~flg_volbelow)}; % survive time of each group + fcensor={flgcensor(flg_volbelow); flgcensor(~flg_volbelow)}; % censor flag for each group + sa_vds{cur_i}.mSurvivalTime=survivedate; + sa_vds{cur_i}.mFlgCensor=fcensor; + % compute survival curves and compare them + sa_vds{cur_i}=sa_vds{cur_i}.fCalculateSurvivalCurve(); + sa_vds{cur_i}=sa_vds{cur_i}.fCombineSurvivalTime(); + sa_vds{cur_i}=sa_vds{cur_i}.fCompareSurvivalByLogrank(); + sa_vds{cur_i}.mHR = cox_hr; + cur_i=cur_i+1; +end + +vds_pvals = [cellfun(@(x) x.mpValue, sa_vds)]; + +% plot pvals vs splits +fg=figure(200); clf reset; hold on; % grid on; +set(fg,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +[sorted_vds,idx_vds] = sort(vds);hold off; +sorted_vds_pvals = vds_pvals(idx_vds); +semilogy(sorted_vds,sorted_vds_pvals); +hold on; +semilogy([min(vds) max(vds)],[0.05 0.05],'r--'); +semilogy([vds_median vds_median],ylim,'g--'); +semilogy([quantile(vds,0.25) quantile(vds,0.25)],ylim,'c--'); +semilogy([quantile(vds,0.75) quantile(vds,0.75)],ylim,'c--'); + +xlabel(['V_{99} Model split value'],'FontSize',16); +ylabel(['Logrank p-value'],'FontSize',16); + +% find best model (lowest logrank) in 2-3 split quartile +mid_quart_vds_pvals = sorted_vds_pvals(find([sorted_vds>quantile(sorted_vds,0.25)].*[sorted_vds0; +[cur_betas,cur_logl,~,cur_stats]=... + coxphfit([vd(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'baseline',0,'censoring',flgcensor(bmi_idx)); + +disp(['= V_{99, a2b=2.1} + BMI CoxPH =']); +disp(['LogL : ',num2str(cur_logl)]); +disp(['p-vals:',10,'v_{d}: ',num2str(cur_stats.p(1)),10,'BMI: ',num2str(cur_stats.p(2))]); +%disp(['p-val : ',num2str(cur_stats.p)]); + +%KM split + + +g=find(bmi_idx); + +vd_bmi = cur_betas(1).*vd(g) + cur_betas(2).*bmi_data(g); + +vd_bmi_median = median(vd_bmi); +disp(['Median: ',num2str(vd_bmi_median,3)]); +sa = repmat({classKaplanMeierCurve()},length(vd_bmi),1); + +% try split at each value of vd_bmi +cur_i=1; +for i=1:length(vd_bmi) + sa{cur_i}.mpValue = inf; + sa{cur_i}.mHR = 0; + [~,fvol] = min(abs(vd_bmi - vd_bmi(i))); + + flg_volbelow = vd_bmilength(vd_bmi)-2, + cur_i=cur_i+1; + continue; + end + + % Cox HR for split + cox_beta=coxphfit(~flg_volbelow,compdate(g),'baseline',0,'censoring',flgcensor(g)); + cox_hr = exp(cox_beta); + + % assign properties of object sa + survivedate={compdate(g(flg_volbelow)); compdate(g(~flg_volbelow))}; % survive time of each group + fcensor={flgcensor(g(flg_volbelow)); flgcensor(g(~flg_volbelow))}; % censor flag for each group + sa{cur_i}.mSurvivalTime=survivedate; + sa{cur_i}.mFlgCensor=fcensor; + % compute survival curves and compare them + sa{cur_i}=sa{cur_i}.fCalculateSurvivalCurve(); + sa{cur_i}=sa{cur_i}.fCombineSurvivalTime(); + sa{cur_i}=sa{cur_i}.fCompareSurvivalByLogrank(); + sa{cur_i}.mHR = cox_hr; + cur_i=cur_i+1; +end + +pvals = [cellfun(@(x) x.mpValue, sa)]; + +% plot pvals vs splits +fg=figure(100); clf reset; hold on; % grid on; +set(fg,'Position',[0 0 screen_size(3)/2 screen_size(4)/2]); + +[sorted_vd_bmi,idx_vd_bmi] = sort(vd_bmi);hold off; +sorted_pvals = pvals(idx_vd_bmi); +semilogy(sorted_vd_bmi,sorted_pvals); +hold on; +semilogy([min(vd_bmi) max(vd_bmi)],[0.05 0.05],'r--'); +semilogy([vd_bmi_median vd_bmi_median],ylim,'g--'); +semilogy([quantile(vd_bmi,0.25) quantile(vd_bmi,0.25)],ylim,'c--'); +semilogy([quantile(vd_bmi,0.75) quantile(vd_bmi,0.75)],ylim,'c--'); + +xlabel(['V_{99}+BMI Model split value'],'FontSize',16); +ylabel(['Logrank p-value'],'FontSize',16); + +% find best model (lowest logrank) in 2-3 split quartile +mid_quart_pvals = sorted_pvals(find([sorted_vd_bmi>quantile(sorted_vd_bmi,0.25)].*[sorted_vd_bmi0; + +%% Load Tx data +[txCox,~,~] = CGobj.fCoxParameter_DVH('Tx'); +tx_data = [txCox.data_exposure]; + +%% For each a2b value, find best V_{D}, + + + + +% for i=1:length(a2b) +% % a2b_vx <- inds of best vx +% cur_best_dose = a2b_vx(i); +% cur_a2b = a2b(i); +% +% % Recalculate dose bins +% vd=zeros(n_grp,1); % volume v at dose d +% vd(:)=0; +% +% for j=1:n_grp +% +% num_fx = CGgrp(j).mFxNum; +% cur_dosebins = CGgrp(j).mDoseBins_org; +% vol = CGgrp(j).mVolCum; +% +% new_dosebins = cur_dosebins.* ... +% ((cur_a2b + (cur_dosebins/num_fx))/... +% (cur_a2b + 2)); +% +% +% f = find( new_dosebins <= cur_best_dose ); f=f(end); % f won't be empty by definition +% if new_dosebins(f) < new_dosebins(end) % not the last element, interpolate to get the best estimation of volume, for the last element, it is zero +% vd(j) = interp1( [new_dosebins(f); new_dosebins(f+1)], [vol(f); vol(f+1)], cur_best_dose ); +% else +% vd(j) = 0; +% end +% end +% +% %% Vd is current best Vd for given a2b, do multivariate +% +% %% Cox(Vd) <- sanity check +% [~,cox_vx_logls(i),~,cox_vx_stats]= coxphfit(vd,compdate,'censoring',flgcensor); +% cox_vx_pvals(i) = cox_vx_stats.p; +% +% [~,cox_vx_bmi_logls(i),~,cox_vx_bmi_stats]=coxphfit([vd(bmi_idx) bmi_data(bmi_idx)],... +% compdate(bmi_idx),'censoring',flgcensor(bmi_idx)); +% cox_vx_bmi_pvals(i,1) = cox_vx_bmi_stats.p(1); +% cox_vx_bmi_pvals(i,2) = cox_vx_bmi_stats.p(2); +% +% [~,cox_vx_bmi_tx_logls(i),~,cox_vx_bmi_tx_stats]=coxphfit([vd(bmi_idx) bmi_data(bmi_idx) tx_data(bmi_idx)],... +% compdate(bmi_idx),'censoring',flgcensor(bmi_idx)); +% cox_vx_bmi_tx_pvals(i,1) = cox_vx_bmi_tx_stats.p(1); +% cox_vx_bmi_tx_pvals(i,2) = cox_vx_bmi_tx_stats.p(2); +% cox_vx_bmi_tx_pvals(i,3) = cox_vx_bmi_tx_stats.p(3); +% +% end + +%%tmp +%vx_range=35:45; +vx_range=1:0.5:200; + +n_grp = CGobj.mNumInGrp; +CGgrp = CGobj.mGrp; + +cox_vx_logls = -inf(length(a2b),length(vx_range)); +cox_vx_bmi_logls = -inf(length(a2b),length(vx_range)); +cox_vx_bmi_tx_logls = -inf(length(a2b),length(vx_range)); + +tic; +lastTime=0; +avg_loop_time=0; + +%%tmp +%tmp_a2b = 1:25; +for i=1:length(a2b) + + cur_a2b = a2b(i); + + % loop over V1 - V100 + + for j=1:length(vx_range) + dose = vx_range(j); + + vd=zeros(n_grp,1); % volume v at dose d + vd(:)=0; + + %loop of patients, calculate new dosebins and vXs + for p=1:n_grp + + num_fx = CGgrp(p).mFxNum; + cur_dosebins = CGgrp(p).mDoseBins_org; + vol = CGgrp(p).mVolCum; + if cur_a2b0; + +%% Load Tx data +[txCox,~,~] = CGobj.fCoxParameter_DVH('Tx'); +tx_data = [txCox.data_exposure]; + +%% For each a2b value, find best V_{D}, + + +% best_dose = 99; +% %best_dose = 165; +% +% [~,fdose_val] = min(abs(CGobj.mBinsDose - best_dose)); +% vd=zeros(CGobj.mNumInGrp,1); % volume v at dose d +% vd(:)=0; +% for k=1:CGobj.mNumInGrp +% vd(k) = CGobj.mGrp(k).fVolAtDose( CGobj.mBinsDose(fdose_val) ); +% end + +n_grp = CGobj.mNumInGrp; +CGgrp = CGobj.mGrp; + +cox_vx_logls = -inf(length(a2b),1); +cox_vx_pvals = -inf(length(a2b),1); +cox_vx_bmi_logls = -inf(length(a2b),1); +cox_vx_bmi_pvals = -inf(length(a2b),2); +cox_vx_bmi_tx_logls = -inf(length(a2b),1); +cox_vx_bmi_tx_pvals = -inf(length(a2b),3); +for i=1:length(a2b) + % a2b_vx <- inds of best vx + cur_best_dose = a2b_vx(i); + cur_a2b = a2b(i); + + % Recalculate dose bins + vd=zeros(n_grp,1); % volume v at dose d + vd(:)=0; + + for j=1:n_grp + + num_fx = CGgrp(j).mFxNum; + cur_dosebins = CGgrp(j).mDoseBins_org; + vol = CGgrp(j).mVolCum; + + new_dosebins = cur_dosebins.* ... + ((cur_a2b + ( /num_fx))/... + (cur_a2b + 2)); + + + f = find( new_dosebins <= cur_best_dose ); f=f(end); % f won't be empty by definition + if new_dosebins(f) < new_dosebins(end) % not the last element, interpolate to get the best estimation of volume, for the last element, it is zero + vd(j) = interp1( [new_dosebins(f); new_dosebins(f+1)], [vol(f); vol(f+1)], cur_best_dose ); + else + vd(j) = 0; + end + end + + %% Vd is current best Vd for given a2b, do multivariate + + %% Cox(Vd) <- sanity check + [~,cox_vx_logls(i),~,cox_vx_stats]= coxphfit(vd,compdate,'censoring',flgcensor); + cox_vx_pvals(i) = cox_vx_stats.p; + + [~,cox_vx_bmi_logls(i),~,cox_vx_bmi_stats]=coxphfit([vd(bmi_idx) bmi_data(bmi_idx)],... + compdate(bmi_idx),'censoring',flgcensor(bmi_idx)); + cox_vx_bmi_pvals(i,1) = cox_vx_bmi_stats.p(1); + cox_vx_bmi_pvals(i,2) = cox_vx_bmi_stats.p(2); + + [~,cox_vx_bmi_tx_logls(i),~,cox_vx_bmi_tx_stats]=coxphfit([vd(bmi_idx) bmi_data(bmi_idx) tx_data(bmi_idx)],... + compdate(bmi_idx),'censoring',flgcensor(bmi_idx)); + cox_vx_bmi_tx_pvals(i,1) = cox_vx_bmi_tx_stats.p(1); + cox_vx_bmi_tx_pvals(i,2) = cox_vx_bmi_tx_stats.p(2); + cox_vx_bmi_tx_pvals(i,3) = cox_vx_bmi_tx_stats.p(3); + +end + +cox_vx_aic = 2-2.*cox_vx_logls; +cox_vx_bmi_aic = 2*2-2.*cox_vx_bmi_logls; +cox_vx_bmi_tx_aic = 2*3-2.*cox_vx_bmi_tx_logls; + +cox_vx_inf_aic = 642.6; +cox_vx_bmi_inf_aic = 639.98; +cox_vx_bmi_tx_inf_aic = 638.9; + + +cur_fig=figure(1); clf reset; hold on; % grid on; +set(gcf,'Position',ss_four2three); + +h_vx=plot(a2b,cox_vx_aic,'r','LineWidth',2);hold on; +h_vx_bmi=plot(a2b,cox_vx_bmi_aic,'g','LineWidth',2); +h_vx_bmi_tx=plot(a2b,cox_vx_bmi_tx_aic,'b','LineWidth',2); + +h_inf_vx=plot(a2b,repmat(cox_vx_inf_aic,length(a2b),1),'--r'); +h_inf_vx_bmi=plot(a2b,repmat(cox_vx_bmi_inf_aic,length(a2b),1),'--g'); +h_inf_vx_bmi_tx=plot(a2b,repmat(cox_vx_bmi_tx_inf_aic,length(a2b),1),'--b'); + +text(2,cox_vx_inf_aic+0.1,['V_{39 Gy}: ',num2str(cox_vx_inf_aic)],'Color','r','FontSize',18); +text(2,cox_vx_bmi_inf_aic+0.1,['V_{39 Gy}+BMI: ',num2str(cox_vx_bmi_inf_aic)],'Color','g','FontSize',18); +text(2,cox_vx_bmi_tx_inf_aic+0.1,['V_{39 Gy}+BMI+Tx: ',num2str(cox_vx_bmi_tx_inf_aic)],'Color','b','FontSize',18); +% h_lgnd=legend([h_vx h_inf_vx h_vx_bmi h_inf_vx_bmi h_vx_bmi_tx h_inf_vx_bmi_tx],... +% 'V_{D}','Phys: V_{39}',... +% 'V_{D}+BMI','Phys: V_{39}+BMI',... +% 'V_{D}+BMI+Tx','Phys: V_{39}+BMI+Tx'); +h_lgnd=legend([h_vx h_vx_bmi h_vx_bmi_tx],... + 'V_{D}',... + 'V_{D}+BMI',... + 'V_{D}+BMI+Tx'); +h_lgnd_title = get(h_lgnd,'title'); +set(h_lgnd_title,'string','Cox Model','FontSize',18); +set(h_lgnd,'FontSize',16); +set(h_lgnd,'Location','NorthEast'); + +set(gca,'FontSize',18); +set(gca,'xminortick','on','yminortick','on'); +ylabel(['AIC [2k-2ln(L)]'],'FontSize',22); +xlabel('\alpha/\beta [Gy]','fontsize',22); +%grid on; + + if do_print, + set(gcf,'Color','w'); + export_fig(gcf,[fig_loc,'cox_a2b_aics'],'-pdf'); + disp(['Saving ',fig_loc,'cox_a2b_aics.pdf']); + end + + %% Plot tri-variate pvalues + + + +end \ No newline at end of file diff --git a/SearchMissingPatients.m b/SearchMissingPatients.m new file mode 100755 index 0000000..6bb94a6 --- /dev/null +++ b/SearchMissingPatients.m @@ -0,0 +1,53 @@ +function SearchMissingPatients +tic; +% parameters; + flg_2cmExp=true; +% path and files + pathname='G:/MSKCC/Andy/Ken/meta/3_28_2010_CW_final_cohort'; + if isunix + pathname=strrep(pathname,'G:','/media/SKI_G'); + end + try + load([pathname,'.mat']); + catch + warning('off','MATLAB:xlsreadold:Truncation'); + [~,~,xlsraw]=xlsread(strcat(pathname,'.xls')); + warning('on','MATLAB:xlsreadold:Truncation'); + save(pathname,'xlsraw'); + end + + if flg_2cmExp + pathname='//Pensmph6/MpcsResearch1/JacksonA/CWDVHs/HFX_Chestwall/2cmExpansion/'; + fnSuffix='_2cmExp.TXT'; + else + pathname='//Pensmph6/MpcsResearch1/JacksonA/CWDVHs/HFX_Chestwall/Colorado/'; + fnSuffix='_Colorado.TXT'; + end + if isunix + pathname=strrep(pathname,'H:','/media/SKI_H'); + end + +% files in the path + d=dir(pathname); + f=false(size(d,1),1); + for k=1:size(d,1) + if isempty(findstr(d(k).name,'.TXT')) || isdir(d(k).name) + f(k)=true; + end + end + d(f)=[]; + +% patient last name in the .xls file + f=cellfun(@(x) strcmp(x,'Patient Last Name'),xlsraw(1,:)); f=find(f); f=f(1); % found the column of "Patient Last Name" + ptnames=xlsraw(2:end,f); % patient last name + +% check patient names in the spread sheet using the file names + disp(' '); + for k=1:size(d,1) + pt=strrep(d(k).name,fnSuffix,''); + f=cellfun(@(x) strcmp(x,pt), ptnames); + if all(~f) + disp(d(k).name); + end + end +toc; \ No newline at end of file diff --git a/TestAlpha2Beta.m b/TestAlpha2Beta.m new file mode 100755 index 0000000..5386503 --- /dev/null +++ b/TestAlpha2Beta.m @@ -0,0 +1,24 @@ +function TestAlpha2Beta + +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; + +fn=['ChestWall_a2b.mat']; + +load(strcat(fp,fn)); +fn2 = ['MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b2.1_b200.mat']; +load(strcat(fp,fn2)); +CGobj=CGobj_current(1); +[VDxCox,flgCox,flganti] = CGobj.fCoxParameter_DVH('VDx'); % find availabe Cox models + + + +screen_size=get(0,'ScreenSize'); +ss_four2three = [0 0 screen_size(3)/2 (screen_size(4)/2)*(4/3)]; + +a2b_inf_logl = a2b_logl(1); +a2b_logl = a2b_logl(2:end); + +a2b = a2b(2:end); + + +end \ No newline at end of file diff --git a/VxFromDVH_batch.m b/VxFromDVH_batch.m new file mode 100755 index 0000000..202b62e --- /dev/null +++ b/VxFromDVH_batch.m @@ -0,0 +1,217 @@ +function VxFromDVH_batch(DosePoint) +tic; +% parameters + dvhdef={'2cmExp';'Colorado'}; + fxnum={-1}; % -1 all fractions, [n1 n2 ...] analyze patients with fractions of n1, n2, ... treatment planning only + beta2alpha=[0]; + +% patient info. + % load patient info stored in the spread sheet + fn='G:/MSKCC/Andy/Ken/tom/20100424CWFinalCohort'; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + try + load(fn,'xlsraw'); + catch + fn1 = strrep(fn,'tom','meta'); + [~,~,xlsraw]=xlsread([fn1,'.xlsx'],'sheet1'); + save(fn,'xlsraw'); + end + + % pick up related data + PtInfo = classDataFromXls(); + PtInfo.xlsRaw = xlsraw; + % MRN + PtInfo.ColName = 'Patient Last Name'; + PtInfo = PtInfo.ExtractColData(); + flgptcode = PtInfo.flgDataRows; + ptcode = PtInfo.ColData; + % Number of Fractions + PtInfo.ColName = 'Number of Fractions'; + PtInfo = PtInfo.ExtractColData(); + flgfx = PtInfo.flgDataRows; + fx = zeros(size(flgfx)); + fx(flgfx) = cell2mat(PtInfo.ColData(flgfx)); + % Date of Birth + PtInfo.ColName = 'Date of Birth'; + PtInfo = PtInfo.ExtractColData(); + flgdatebirth = PtInfo.flgDataRows; + datebirth = zeros(size(flgdatebirth)); + f = PtInfo.ColData(flgdatebirth); + datebirth(flgdatebirth) = datenum(f); + % IGRT Start Date + PtInfo.ColName = 'IGRT Start Date'; + PtInfo = PtInfo.ExtractColData(); + flgdateIGRT = PtInfo.flgDataRows; + dateIGRT = zeros(size(flgdateIGRT)); + f = PtInfo.ColData(flgdateIGRT); + dateIGRT(flgdateIGRT) = datenum(f); + % Last Follow Up Date + PtInfo.ColName = 'Surv Date'; + PtInfo = PtInfo.ExtractColData(); + flgdatefu = PtInfo.flgDataRows; + datefu = zeros(size(flgdatefu)); + datefu(flgdatefu) = datenum(PtInfo.ColData(flgdatefu)); + % complication grade 3 + PtInfo.ColName = 'Pain Grade 3'; + PtInfo = PtInfo.ExtractColData(); + datepain = inf(size(PtInfo.ColData)); + flgcensor = true(size(datefu)); + f = PtInfo.flgDataRows; + datepain(f) = datenum(PtInfo.ColData(f)); + flgcensor(f) = false; + % complication grade 2 + PtInfo.ColName = 'Pain Grade 2'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + datepain(f) = datenum(PtInfo.ColData(f)); + flgcensor(f) = false; + % relapse date + PtInfo.ColName = 'Local Failure'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + flgfailure = false(size(f)); + flgfailure(f) = cell2mat(PtInfo.ColData(f)); + PtInfo.ColName = 'Local Failure Date'; + PtInfo = PtInfo.ExtractColData(); + flgrelapse = PtInfo.flgDataRows; + datefailure = inf(size(flgrelapse)); + datefailure(flgrelapse&flgfailure) = datenum(PtInfo.ColData(flgrelapse&flgfailure)); + flgrelapse = flgrelapse&f; + % gender + PtInfo.ColName = 'Sex'; + PtInfo = PtInfo.ExtractColData(); + flggender = PtInfo.flgDataRows; + ptgender = PtInfo.ColData; + % death date + PtInfo.ColName = 'Surv alive 0, dead 1'; + PtInfo = PtInfo.ExtractColData(); + f1 = PtInfo.flgDataRows; + flgdeath = false(size(f1)); + flgdeath(f1) = cell2mat(PtInfo.ColData(f1)); + PtInfo.ColName = 'death Date'; + PtInfo = PtInfo.ExtractColData(); + f = PtInfo.flgDataRows; + datedeath = inf(size(f)); + datedeath(f&flgdeath) = datenum(PtInfo.ColData(f&flgdeath)); + flgdeath = f1&f; + + % common part of those data + flg = flgptcode & flgfx & flgdatebirth & flgdateIGRT & flgdatefu & flgrelapse & flggender & flgdeath; + ptcode=ptcode(flg); + fx=fx(flg); + datebirth=datebirth(flg); + dateIGRT=dateIGRT(flg); + datefu=datefu(flg); + datepain=datepain(flg); + flgcensor=flgcensor(flg); + datefailure = datefailure(flg); + ptgender = ptgender(flg); + datedeath = datedeath(flg); + + % patient DVH and objects + CGobj_org=classComplicationGroup(); + CGobj_org.DoseStep_DVH = dosestep; + CGobj_org.VolStep_DVH = volstep; + CGobj_org.TimeStep_DVH = timestep; + + for m=1:length(dvhdef) % iterate with each definition + % load dvh info + fn=['G:/MSKCC/Andy/Ken/meta/DVH_',dvhdef{m}]; + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + load(fn,'DVH'); + + % match patients DVH and .xls + [f1,g1]=ismember(ptcode,DVH(:,1)); + [f2,g2]=ismember(DVH(:,1),ptcode); + if length(unique(g2(g2~=0)))~=length(find(g2))% || length(unique(g2~=0))~=length(find(g2)) + error('The patient ids are not unique'); + end + if ~( all(f1) && all(f2) ) + disp('The patients in the spread sheet do not match with those in DVH curves, take the common part'); + % use common part only + DVH=DVH(f2,:); + ptcode=ptcode(f1); fx=fx(f1); datebirth=datebirth(f1); dateIGRT=dateIGRT(f1); datefu=datefu(f1); datepain=datepain(f1); flgcensor=flgcensor(f1); + [~,g1]=ismember(ptcode,DVH(:,1)); + end + + % combine info from DVH and .xls to form complicationgroup object + CIobjs = classComplicationIndividual(); + CIobjs = repmat(CIobjs,[size(DVH,1),1]); + for n = 1:size(DVH,1) + CIobjs(n,1).PatientID=ptcode{n}; + CIobjs(n,1).DoseBins_org=DVH{g1(n),2}(:,1); + CIobjs(n,1).VolDiff=DVH{g1(n),2}(:,2); + CIobjs(n,1).VolCum=DVH{g1(n),2}(:,3); + CIobjs(n,1).FxNum=fx(n); + CIobjs(n,1).DoseStep = dosestep; + CIobjs(n,1).VolStep = volstep; + CIobjs(n,1).BirthDate = datebirth(n); + CIobjs(n,1).BaselineDate = dateIGRT(n); + CIobjs(n,1).CompOccurDate = datepain(n); + CIobjs(n,1).LastFollowupDate = datefu(n); + CIobjs(n,1).flgCensor = flgcensor(n); + CIobjs(n,1).RelapseDate = datefailure(n); + CIobjs(n,1).Gender = ptgender(n); + CIobjs(n,1).DeathDate = datedeath(n); + end + if any([CIobjs.FxNum]==0) + error('Fraction number is zeros'); + end + CGobj_org = CGobj_org.AddPatient(CIobjs); + + % per fraction category + for n=1:length(fxnum) + % pick up patient with the wanted fraction numbers + if any(fxnum{n}==-1) + f1=true(CGobj_org.numGrp,1); + else % retrieve patients with exact fractions only + f1=arrayfun(@(x) any(x==fxnum{n}),{CGobj_org.ptGrp.FxNum}); + end + CGobj_current = CGobj_org; + CGobj_current.ptGrp = CGobj_current.ptGrp(f1); + CGobj_current.numGrp = size(CGobj_current.ptGrp,1); + + % for each alpha/beta compute a series of complication table + for u = 1:length(beta2alpha) + % adjust beta to alpha ratio + CGobj_current.Beta2Alpha = beta2alpha(u); + CGobj_current = CGobj_current.LinearQuartraticCorrection(); + + % atlas + if flglog + CGobj_current = CGobj_current.CalculateDoseBinsLog_DVH(); + else + CGobj_current = CGobj_current.CalculateDoseBins_DVH(); + end + CGobj_current = CGobj_current.CalculateVolBins_DVH(); + CGobj_current = CGobj_current.CalculateTimeBins_DVH(); + + CGobj_current = CGobj_current.SurvivalCurves_DVH(); + CGobj_current = CGobj_current.CoxModelExact_DVH(); + CGobj_current = CGobj_current.LogRankTestDxExact_DVH(); + CGobj_current = CGobj_current.LogRankTestVxExact_DVH(); + CGobj_current = CGobj_current.LogRankTestDVxExact_DVH(); + CGobj_current = CGobj_current.ComplicationCurves_DVH(); +% CGobj_current = CGobj_current.CrudeAtlasAlongTime_DVH(); % crude atlas +% CGobj_current = CGobj_current.ActuaryAtlasAlongTime_DVH(); % survival maps + + % save result + CGstrct = ObjToStruct(CGobj_current); + if flglog + fn=['G:/MSKCC/Andy/Ken/tom/CW_Cox_DiVj_',dvhdef{m},'_fx',num2str(fxnum{n}(1)),'_log_ratio',num2str(beta2alpha(u)),'.mat']; + else + fn=['G:/MSKCC/Andy/Ken/tom/CW_Cox_DiVj_',dvhdef{m},'_fx',num2str(fxnum{n}(1)),'_ratio',num2str(beta2alpha(u)),'.mat']; + end + if isunix + fn=strrep(fn,'G:','/media/SKI_G'); + end + save(fn,'CGobj_current','CGstrct'); + disp(fn); + end + end + end +toc; \ No newline at end of file diff --git a/WriteCoxModelResults.m b/WriteCoxModelResults.m new file mode 100755 index 0000000..ae7bccb --- /dev/null +++ b/WriteCoxModelResults.m @@ -0,0 +1,71 @@ +function WriteCoxModelResults +tic; + +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; +fn = {'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b10_b200.mat', + 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b20_b200.mat', + 'MUTTER_MASTER_ChestWall_Cox_DiVj_DVHs_fx-1_a2b15_b200.mat'}; + +disp([]); + +load(strcat(fp,fn{1}),'CGobj_current'); +CGobj_a2b10 = CGobj_current; +load(strcat(fp,fn{2}),'CGobj_current'); +CGobj_a2b20 = CGobj_current; +load(strcat(fp,fn{3}),'CGobj_current'); +CGobj_a2b15 = CGobj_current; + +clear CGobj_current; + +%% Load DVx +[curDVxCox,flgCox,flganti] = CGobj_a2b10.fCoxParameter_DVH('DVx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b10_DVxCox = curDVxCox(flgCox); +x_a2b10_dvx=[a2b10_DVxCox.bin]; + +[curDVxCox,flgCox,flganti] = CGobj_a2b20.fCoxParameter_DVH('DVx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b20_DVxCox = curDVxCox(flgCox); +x_a2b20_dvx=[a2b20_DVxCox.bin]; + +[curDVxCox,flgCox,flganti] = CGobj_a2b15.fCoxParameter_DVH('DVx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b15_DVxCox = curDVxCox(flgCox); +x_a2b15_dvx=[a2b15_DVxCox.bin]; + +%% Load VDx +[curVDxCox,flgCox,flganti] = CGobj_a2b10.fCoxParameter_DVH('VDx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b10_VDxCox = curVDxCox(flgCox); +x_a2b10_vdx=[a2b10_VDxCox.bin]; + +[curVDxCox,flgCox,flganti] = CGobj_a2b20.fCoxParameter_DVH('VDx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b20_VDxCox = curVDxCox(flgCox); +x_a2b20_vdx=[a2b20_VDxCox.bin]; + +[curVDxCox,flgCox,flganti] = CGobj_a2b15.fCoxParameter_DVH('VDx'); % find availabe Cox models +flgCox(flganti)=false; % anti-correlations were not be considered +a2b15_VDxCox = curVDxCox(flgCox); +x_a2b15_vdx=[a2b15_VDxCox.bin]; + + +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_10-20_b200.mat']; + +save(strcat(fp,fn),... + 'a2b10_DVxCox','a2b10_VDxCox',... + 'x_a2b10_dvx','x_a2b10_vdx',... + 'a2b20_DVxCox','a2b20_VDxCox',... + 'x_a2b20_dvx','x_a2b20_vdx',... + 'a2b15_DVxCox','a2b15_VDxCox',... + 'x_a2b15_dvx','x_a2b15_vdx'); +% 'a2b10_DVxCox','a2b10_VDxCox',... +% 'x_a2b10_dvx','x_a2b10_vdx',... +% 'a2b20_DVxCox','a2b20_VDxCox',... +% 'x_a2b20_dvx','x_a2b20_vdx',... +% 'a2b15_DVxCox','a2b15_VDxCox',... +% 'x_a2b15_dvx','x_a2b15_vdx'); +% ,... + +disp(['Saving: ',fn]); +end diff --git a/WriteCoxModelResults2.m b/WriteCoxModelResults2.m new file mode 100755 index 0000000..24a380f --- /dev/null +++ b/WriteCoxModelResults2.m @@ -0,0 +1,19 @@ +function WriteCoxModelResults2 + +fp = 'C:\Documents and Settings\williae1\cw_meta_data\'; +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_300-500_b200.mat'];% 300, 400, 500 +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_75-200_b200.mat'];% 75, 100, 200 +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_30-50_b200.mat']; +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_10-20_b200.mat']; +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_3-5_b200.mat']; +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_Inf-2_b200.mat']; +load(strcat(fp,fn)) +fn=['MUTTER_MASTER_ChestWall_CoxPHM_Results_a2b_b200.mat']; +save(strcat(fp,fn)) + +end \ No newline at end of file