|
60 | 60 | % Define stoichiometry.
|
61 | 61 | ModelGR.stoichiometry = [-1,1,1,-1,0;...
|
62 | 62 | 1,-1,0,0,-1];
|
63 |
| - |
| 63 | + |
64 | 64 | % Specify parameter guesses.
|
65 | 65 | ModelGR.parameters = ({'koff',0.1;'kon',0.1;'kr',1;'gr',0.02;...
|
66 | 66 | 'kcn0',0.005;'kcn1',0.02;'gDex',0.003;'knc',0.01;'kg1',14e-5;...
|
67 | 67 | 'gg1',1e-5;'gg2',1e-6;'MDex',5;'Dex0',100});
|
68 | 68 |
|
| 69 | + % Print visual summary of the model |
| 70 | + ModelGR.summarizeModel |
69 | 71 |
|
| 72 | + %% The log prior will be applied to the fit to multiple models as an additional constraint. |
70 | 73 | log10PriorMean = [-1 -1 0 -2,...
|
71 | 74 | -1 -3 -2 -1 -2 -2 -2 0.5, 2];
|
72 | 75 | log10PriorStd = 2*ones(1,13);
|
73 |
| - % the log prior will be applied to the fit to multiple models as an |
74 |
| - % additional constraint. |
75 |
| - ModelGR.fittingOptions.logPrior = []; |
| 76 | + |
76 | 77 | % So it is left out of the prior, since we only want it to be calculated once.
|
| 78 | + ModelGR.fittingOptions.logPrior = []; |
| 79 | + |
77 | 80 |
|
78 | 81 | ModelGR.fspOptions.initApproxSS = true;
|
79 | 82 | ModelGR.fittingOptions.modelVarsToFit = (5:12);
|
|
87 | 90 | [FSPGrSoln,ModelGR.fspOptions.bounds] = ModelGR.solve(FSPGrSoln.stateSpace);
|
88 | 91 |
|
89 | 92 | % STEP 0.B.2. -- Define GR parameters
|
90 |
| - fitIters = 3; |
91 | 93 | GRpars = cell2mat(ModelGR.parameters(5:12,2))';
|
92 | 94 |
|
93 | 95 | % STEP 0.B.3. -- Associate GR Data with Different Instances of Model (10,100nm Dex)
|
|
118 | 120 | % First N are lower bounds. Next N is upper bound. Remaining are
|
119 | 121 | % custom.
|
120 | 122 | end
|
| 123 | + % Set for STEP1 -- Fit GR Models |
| 124 | + fitIters = 30; |
121 | 125 | end
|
122 | 126 |
|
123 | 127 | %% STEP 1 -- Fit GR Models
|
|
129 | 133 | % STEP 1.B. -- Specify log prior (NOTE: must transpose due to Matlab update that
|
130 | 134 | % no longer correctly assumes format when adding single value vector to
|
131 | 135 | % column vector).
|
132 |
| -%logPriorGR = @(x)-sum((log10(x)-log10PriorMean(5:12)').^2./(2*log10PriorStd(5:12)'.^2)); |
| 136 | + |
| 137 | +logPriorGR = @(x)-sum((log10(x)-log10PriorMean(5:12)').^2./(2*log10PriorStd(5:12)'.^2)); |
133 | 138 |
|
134 | 139 | % STEP 1.C. -- Combine all three GR models and fit using a single parameter set.
|
135 | 140 | for jj = 1:fitIters
|
136 |
| - %combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap,logPriorGR); |
137 |
| - combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap); |
| 141 | + combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap,logPriorGR); |
138 | 142 | combinedGRModel = combinedGRModel.initializeStateSpaces(boundGuesses);
|
139 | 143 | combinedGRModel = combinedGRModel.updateModels(GRpars,false);
|
140 | 144 | GRpars = combinedGRModel.maximizeLikelihood(...
|
141 | 145 | GRpars, fitOptions);
|
142 | 146 | save('EricModel_MMDex','GRpars')
|
143 | 147 | end
|
144 | 148 |
|
| 149 | +save('EricModelGR_MMDex','GRpars','combinedGRModel') |
| 150 | + |
145 | 151 | %% STEP 1.D. -- Compute FIM for GR parameters.
|
146 | 152 | combinedGRModel = combinedGRModel.computeFIMs([],'log');
|
147 | 153 | fimGR_withPrior = combinedGRModel.FIM.totalFIM+... % the FIM in log space.
|
148 | 154 | diag(1./(log10PriorStd(ModelGR.fittingOptions.modelVarsToFit)*log(10)).^2); % Add prior in log space.
|
149 | 155 |
|
150 |
| -%% STEP 1.C. -- Run MH on GR Models. |
| 156 | +if min(eig(fimGR_withPrior))<1 |
| 157 | + disp('Warning -- FIM has one or more small eigenvalues. Reducing proposal width to 10x in those directions. MH Convergence may be slow.') |
| 158 | + fimGR_withPrior = fimGR_withPrior + 1*eye(length(fimGR_withPrior)); |
| 159 | +end |
| 160 | +covFree = fimGR_withPrior^-1; |
| 161 | +covFree = 0.5*(covFree+covFree'); |
| 162 | + |
| 163 | +%% STEP 1.E. -- Run MH on GR Models. |
151 | 164 | %GRpars = GRpars';
|
152 | 165 | MHFitOptions.thin=1;
|
153 |
| -MHFitOptions.numberOfSamples=1000; |
154 |
| -MHFitOptions.burnIn=0; |
| 166 | +MHFitOptions.numberOfSamples=3000; |
| 167 | +MHFitOptions.burnIn=1000; |
155 | 168 | MHFitOptions.progress=true;
|
156 | 169 | MHFitOptions.numChains = 1;
|
| 170 | + |
| 171 | +% Use FIM computed above rather than making SSIT call 'useFIMforMetHast' |
| 172 | +% which forces SSIT.m to compute it within (no prior, etc.) |
157 | 173 | MHFitOptions.useFIMforMetHast = false;
|
| 174 | +MHFitOptions.proposalDistribution=@(x)mvnrnd(x,covFree); |
| 175 | + |
158 | 176 | MHFitOptions.saveFile = 'TMPEricMHGR.mat';
|
159 | 177 | [~,~,MHResultsGR] = combinedGRModel.maximizeLikelihood(...
|
160 | 178 | GRpars, MHFitOptions, 'MetropolisHastings');
|
161 |
| -delete(MHFitOptions.saveFile) |
| 179 | +%delete(MHFitOptions.saveFile) |
162 | 180 | %%
|
163 | 181 | figNew = figure;
|
164 | 182 | ModelGR.plotMHResults(MHResultsGR,[],'log',[],figNew)
|
|
171 | 189 | end
|
172 | 190 | end
|
173 | 191 |
|
174 |
| -%% STEP 1.D. -- Make Plots of GR Fit Results |
| 192 | +%% STEP 1.F. -- Make Plots of GR Fit Results |
175 | 193 | makeGRPlots(combinedGRModel,GRpars)
|
176 | 194 |
|
| 195 | +save('EricModelGR_MMDex','GRpars','combinedGRModel','MHResultsGR') |
| 196 | + |
177 | 197 | %% STEP 2 -- Extend Model to Include DUSP1 Activation, Production, and Degradation
|
178 | 198 | if loadPrevious
|
179 | 199 | varNamesDUSP1 = {'ModelGRDusp100nM'
|
|
265 | 285 | ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars);
|
266 | 286 | save('EricModelDusp1_MMDex','GRpars','DUSP1pars')
|
267 | 287 | end
|
| 288 | + |
268 | 289 | %% STEP 2.C. -- Plot predictions for other Dex concentrations.
|
269 | 290 | showCases = [1,1,1,1];
|
270 | 291 | makePlotsDUSP1({ModelGRDusp100nM},ModelGRDusp100nM,DUSP1pars,Dusp1FitCases,showCases)
|
|
310 | 331 | delete('TMPEricMHDusp1.mat')
|
311 | 332 | ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars);
|
312 | 333 | end
|
313 |
| -%% STEP 1.B. -- Compute FIM for GR parameters. |
314 |
| -combinedGRModel = combinedGRModel.computeFIMs([],'log'); |
315 |
| -fimGR_withPrior = combinedGRModel.FIM.totalFIM+... % the FIM in log space. |
316 |
| - diag(1./(log10PriorStd(ModelGR.fittingOptions.modelVarsToFit)*log(10)).^2); % Add prior in log space. |
317 |
| -%% STEP 1.C. -- Run MH on GR Models. |
318 |
| -%GRpars = GRpars'; |
319 |
| -MHFitOptions.proposalDistribution=@(x)mvnrnd(x,covFree); |
320 |
| -MHFitOptions.thin=1; |
321 |
| -MHFitOptions.numberOfSamples=1000; |
322 |
| -MHFitOptions.burnIn=0; |
323 |
| -MHFitOptions.progress=true; |
324 |
| -MHFitOptions.numChains = 1; |
325 |
| -MHFitOptions.useFIMforMetHast = true; |
326 |
| -MHFitOptions.saveFile = 'TMPEricMHGR.mat'; |
327 |
| -[GRpars,~,MHResultsGR] = combinedGRModel.maximizeLikelihood(... |
328 |
| - GRpars, MHFitOptions, 'MetropolisHastings'); |
329 |
| -delete(MHFitOptions.saveFile) |
330 |
| -%% |
331 |
| -figNew = figure; |
332 |
| -ModelGR.plotMHResults(MHResultsGR,[],'log',[],figNew) |
333 |
| -for i = 1:7 |
334 |
| - for j = i+1:7 |
335 |
| - subplot(7,7,(i-1)*7+j-1) |
336 |
| - CH = get(gca,'Children'); |
337 |
| - CH(1).Color=[1,0,1]; % |
338 |
| - CH(1).LineWidth = 3; |
339 |
| - end |
340 |
| -end |
341 |
| - |
342 |
| -%% STEP 1.D. -- Make Plots of GR Fit Results |
343 |
| -makeGRPlots(combinedGRModel,GRpars) |
344 |
| -%% |
345 |
| -%% STEP 2 -- Extend Model to Include DUSP1 Activation, Production, and Degradation |
346 |
| -if loadPrevious |
347 |
| - varNamesDUSP1 = {'ModelGRDusp100nM' |
348 |
| - 'GRfitCases' |
349 |
| - 'log10PriorMean' |
350 |
| - 'log10PriorStd' |
351 |
| - 'duspLogPrior' |
352 |
| - 'DUSP1pars' |
353 |
| - 'Dusp1FitCases'}; |
354 |
| - load(savedWorkspace,varNamesDUSP1{:}) |
355 |
| - fitOptions = optimset('Display','iter','MaxIter',10); |
356 |
| - fitIters = 1; |
357 |
| - try |
358 |
| - ModelGRDusp100nM.propensitiesGeneral{1}.stateDependentFactor(0); |
359 |
| - catch |
360 |
| - ModelGRDusp100nM = ModelGRDusp100nM.formPropensitiesGeneral('DUSP1_Model'); |
361 |
| - end |
362 |
| -else |
363 |
| - %% STEP 2.A.1. -- Add DUSP1 to the existing GR model. |
364 |
| - % Copy parameters from the 100nM Dex stim case in GR. |
365 |
| - fitIters = 3; |
366 |
| - ModelGRDusp100nM = ModelGRfit{3}; |
367 |
| - ModelGRDusp100nM.species = {'offGene';'onGene';'cytGR';'nucGR';'rna'}; |
368 |
| - ModelGRDusp100nM.initialCondition = [2;0;24;1;5]; |
369 |
| - ModelGRDusp100nM.propensityFunctions = {'kon*offGene*nucGR';'koff*onGene'; |
370 |
| - '(kcn0 + (t>0)*kcn1*IDex/(MDex+IDex)) * cytGR';'knc*nucGR';'kg1';'gg1*cytGR';'gg2*nucGR';... |
371 |
| - 'kr*onGene';'gr*rna'}; |
372 |
| - ModelGRDusp100nM.stoichiometry = [-1,1,0,0,0,0,0,0,0;... |
373 |
| - 1,-1,0,0,0,0,0,0,0;... |
374 |
| - 0,0,-1,1,1,-1,0,0,0;... |
375 |
| - 0,0,1,-1,0,0,-1,0,0;... |
376 |
| - 0,0,0,0,0,0,0,1,-1]; |
377 |
| - ModelGRDusp100nM.useHybrid = true; |
378 |
| - ModelGRDusp100nM.hybridOptions.upstreamODEs = {'cytGR','nucGR'}; |
379 |
| - ModelGRDusp100nM.solutionScheme = 'FSP'; |
380 |
| - ModelGRDusp100nM.customConstraintFuns = []; |
381 |
| - ModelGRDusp100nM.fspOptions.bounds = [0;0;0;2;2;400]; |
382 |
| - ModelGRDusp100nM.fittingOptions.modelVarsToFit = 1:4; |
383 |
| - ModelGRDusp100nM = ModelGRDusp100nM.formPropensitiesGeneral('EricModDusp1'); |
384 |
| - duspLogPrior = @(x)-sum((log10(x(:))'-log10PriorMean(1:4)).^2./(2*log10PriorStd(1:4).^2)); |
385 |
| - ModelGRDusp100nM.fittingOptions.logPrior = duspLogPrior; |
386 |
| - |
387 |
| - %% STEP 2.A.2. -- Load pre-fit parameters into model. |
388 |
| - if loadPrevious |
389 |
| - load('EricModelDusp1_MMDex','DUSP1pars') |
390 |
| - else |
391 |
| - %% Pull the DUSP1 parameters from the Model |
392 |
| - % Find the indices of the desired parameter names |
393 |
| - knc_idx = find(strcmp(ModelGRDusp100nM.parameters(:,1), 'knc')); |
394 |
| - kg1_idx = find(strcmp(ModelGRDusp100nM.parameters(:,1), 'kg1')); |
395 |
| - gg1_idx = find(strcmp(ModelGRDusp100nM.parameters(:,1), 'gg1')); |
396 |
| - gg2_idx = find(strcmp(ModelGRDusp100nM.parameters(:,1), 'gg2')); |
397 | 334 |
|
398 |
| - % Extract the values and store them in DUSP1pars |
399 |
| - DUSP1pars = [ModelGRDusp100nM.parameters{knc_idx, 2}, ... |
400 |
| - ModelGRDusp100nM.parameters{kg1_idx, 2}, ... |
401 |
| - ModelGRDusp100nM.parameters{gg1_idx, 2}, ... |
402 |
| - ModelGRDusp100nM.parameters{gg2_idx, 2}]; |
403 |
| - end |
404 |
| - ModelGRDusp100nM.parameters(ModelGRDusp100nM.fittingOptions.modelVarsToFit,2) = num2cell(DUSP1pars); |
405 |
| - %% STEP 2.A.3. -- Load and Associate with DUSP1 smFISH Data (100nM Dex Only) |
406 |
| - % The commented code below would be needed to fit multiple conditions, |
407 |
| - % but that is not used in this case. It is left here in case it is |
408 |
| - % needed in later stages of the project. |
409 |
| - % % % Dusp1FitCases = {'100','100',201,'DUSP1 Fit (100nM Dex)'}; |
410 |
| - % % % ModelDusp1Fit = cell(size(Dusp1FitCases,1),1); |
411 |
| - % % % ModelDusp1parameterMap = cell(1,size(GRfitCases,1)); |
412 |
| - % % % for i = 1:size(Dusp1FitCases,1) |
413 |
| - % % % ModelDusp1Fit{i} = ModelGRDusp100nM.loadData('EricData/pdoCalibrationData_EricIntensity_DexSweeps.csv',... |
414 |
| - % % % {'rna','totalNucRNA'},... |
415 |
| - % % % {'Dex_Conc','100'}); |
416 |
| - % % % ModelDusp1Fit{i}.inputExpressions = {'IDex','Dex0*exp(-gDex*t)'}; |
417 |
| - % % % |
418 |
| - % % % ModelDusp1parameterMap{i} = (1:4); |
419 |
| - % % % % Set Dex concentration. |
420 |
| - % % % ModelDusp1Fit{i}.parameters{13,2} = str2num(Dusp1FitCases{i,1}); |
421 |
| - % % % ModelDusp1Fit{i} = ModelDusp1Fit{i}.formPropensitiesGeneral(['EricModDusp1_',num2str(i),'_FSP']); |
422 |
| - % % % end |
423 |
| - % % % DUSP1pars = [ModelDusp1Fit{i}.parameters{ModelGRDusp100nM.fittingOptions.modelVarsToFit,2}]; |
424 |
| - ModelGRDusp100nM = ModelGRDusp100nM.loadData('EricData/pdoCalibrationData_EricIntensity_DexSweeps.csv',... |
425 |
| - {'rna','totalNucRNA'},{'Dex_Conc','100'}); |
426 |
| - DUSP1pars = [ModelGRDusp100nM.parameters{ModelGRDusp100nM.fittingOptions.modelVarsToFit,2}]; |
427 |
| -end |
428 |
| -%% STEP 2.B. -- Fit DUSP1 model at 100nM Dex. |
429 |
| -for i = 1:fitIters |
430 |
| - fitOptions.suppressFSPExpansion = true; |
431 |
| - DUSP1pars = ModelGRDusp100nM.maximizeLikelihood(... |
432 |
| - DUSP1pars, fitOptions); |
433 |
| - ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars); |
434 |
| - save('EricModelDusp1_MMDex','GRpars','DUSP1pars') |
435 |
| -end |
436 |
| -%% STEP 2.C. -- Plot predictions for other Dex concentrations. |
437 |
| -showCases = [1,1,1,1]; |
438 |
| -makePlotsDUSP1({ModelGRDusp100nM},ModelGRDusp100nM,DUSP1pars,Dusp1FitCases,showCases) |
439 |
| -%% STEP 2.D. -- Sample uncertainty for Dusp1 Parameters |
440 |
| -%% STEP 2.D.1. -- Compute sensitivity of the FSP solution |
441 |
| -ModelGRDusp100nM.solutionScheme = 'fspSens'; |
442 |
| -sensSoln = ModelGRDusp100nM.solve(); |
443 |
| -ModelGRDusp100nM.solutionScheme = 'FSP'; |
444 |
| -%% STEP 2.D.2. -- Compute FIM |
445 |
| -% define which species in model are not observed. |
446 |
| -ModelGRDusp100nM.pdoOptions.unobservedSpecies = {'offGene';'onGene'}; |
447 |
| -% compute the FIM |
448 |
| -fimResults = ModelGRDusp100nM.computeFIM(sensSoln.sens,'log'); |
449 |
| -% In the following, the log-prior is used as a prior co-variance matrix. |
450 |
| -% This will be used in the FIM calculation as an FIM without new evidence |
451 |
| -% being set equal to the inverse of this covariance matrix. More rigorous |
452 |
| -% justification is needed to support this heuristic. |
453 |
| -fimTotal = ModelGRDusp100nM.evaluateExperiment(fimResults,ModelGRDusp100nM.dataSet.nCells,... |
454 |
| - diag(log10PriorStd(1:13).^2)); |
455 |
| -FIMfree = fimTotal{1}(1:4,1:4); |
456 |
| -if min(eig(FIMfree))<1 |
457 |
| - disp('Warning -- FIM has one or more small eigenvalues. Reducing proposal width to 10x in those directions. MH Convergence may be slow.') |
458 |
| - FIMfree = FIMfree + 1*eye(length(FIMfree)); |
459 |
| -end |
460 |
| -covFree = FIMfree^-1; |
461 |
| -covFree = 0.5*(covFree+covFree'); |
462 |
| -% |
463 |
| -%% STEP 2.D.3. -- Run Metropolis Hastings Search |
464 |
| -if loadPrevious |
465 |
| - MHDusp1File = 'MHDusp1_Jul22'; |
466 |
| - load(MHDusp1File) |
467 |
| -else |
468 |
| - MHFitOptions.proposalDistribution=@(x)mvnrnd(x,covFree); |
469 |
| - MHFitOptions.thin=1; |
470 |
| - MHFitOptions.numberOfSamples=1000; |
471 |
| - MHFitOptions.burnIn=0; |
472 |
| - MHFitOptions.progress=true; |
473 |
| - MHFitOptions.numChains = 1; |
474 |
| - MHFitOptions.saveFile = 'TMPEricMHDusp1.mat'; |
475 |
| - [DUSP1pars,~,MHResultsDusp1] = ModelGRDusp100nM.maximizeLikelihood(... |
476 |
| - [], MHFitOptions, 'MetropolisHastings'); |
477 |
| - delete('TMPEricMHDusp1.mat') |
478 |
| - ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars); |
479 |
| -end |
480 |
| -%% STEP 2.D.4. -- Plot the MH results |
481 |
| -figNew = figure; |
482 |
| -ModelGRDusp100nM.plotMHResults(MHResultsDusp1,[],'log',[],figNew) |
483 |
| -for i = 1:3 |
484 |
| - for j = i:3 |
485 |
| - subplot(3,3,(i-1)*3+j) |
486 |
| - CH = get(gca,'Children'); |
487 |
| - CH(1).Color=[1,0,1]; % |
488 |
| - CH(1).LineWidth = 3; |
489 |
| - end |
490 |
| -end |
491 |
| -%% |
492 | 335 | %% STEP 3. -- Model Extensions using ODE Analyses
|
493 | 336 | if loadPrevious
|
494 | 337 | vaNamesExtended = {'ModelGRfit'
|
|
0 commit comments