Skip to content

Commit ba56a7c

Browse files
authored
Add comments, use FIM results for combinedGRModel in MH proposal distribution, save results, remove redundant code
1 parent 60cf301 commit ba56a7c

File tree

1 file changed

+34
-191
lines changed

1 file changed

+34
-191
lines changed

WorkSpace/EricModel/a0_Fit_GR_and_DUSP1_models.m

+34-191
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,23 @@
6060
% Define stoichiometry.
6161
ModelGR.stoichiometry = [-1,1,1,-1,0;...
6262
1,-1,0,0,-1];
63-
63+
6464
% Specify parameter guesses.
6565
ModelGR.parameters = ({'koff',0.1;'kon',0.1;'kr',1;'gr',0.02;...
6666
'kcn0',0.005;'kcn1',0.02;'gDex',0.003;'knc',0.01;'kg1',14e-5;...
6767
'gg1',1e-5;'gg2',1e-6;'MDex',5;'Dex0',100});
6868

69+
% Print visual summary of the model
70+
ModelGR.summarizeModel
6971

72+
%% The log prior will be applied to the fit to multiple models as an additional constraint.
7073
log10PriorMean = [-1 -1 0 -2,...
7174
-1 -3 -2 -1 -2 -2 -2 0.5, 2];
7275
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+
7677
% So it is left out of the prior, since we only want it to be calculated once.
78+
ModelGR.fittingOptions.logPrior = [];
79+
7780

7881
ModelGR.fspOptions.initApproxSS = true;
7982
ModelGR.fittingOptions.modelVarsToFit = (5:12);
@@ -87,7 +90,6 @@
8790
[FSPGrSoln,ModelGR.fspOptions.bounds] = ModelGR.solve(FSPGrSoln.stateSpace);
8891

8992
% STEP 0.B.2. -- Define GR parameters
90-
fitIters = 3;
9193
GRpars = cell2mat(ModelGR.parameters(5:12,2))';
9294

9395
% STEP 0.B.3. -- Associate GR Data with Different Instances of Model (10,100nm Dex)
@@ -118,6 +120,8 @@
118120
% First N are lower bounds. Next N is upper bound. Remaining are
119121
% custom.
120122
end
123+
% Set for STEP1 -- Fit GR Models
124+
fitIters = 30;
121125
end
122126

123127
%% STEP 1 -- Fit GR Models
@@ -129,36 +133,50 @@
129133
% STEP 1.B. -- Specify log prior (NOTE: must transpose due to Matlab update that
130134
% no longer correctly assumes format when adding single value vector to
131135
% 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));
133138

134139
% STEP 1.C. -- Combine all three GR models and fit using a single parameter set.
135140
for jj = 1:fitIters
136-
%combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap,logPriorGR);
137-
combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap);
141+
combinedGRModel = SSITMultiModel(ModelGRfit,ModelGRparameterMap,logPriorGR);
138142
combinedGRModel = combinedGRModel.initializeStateSpaces(boundGuesses);
139143
combinedGRModel = combinedGRModel.updateModels(GRpars,false);
140144
GRpars = combinedGRModel.maximizeLikelihood(...
141145
GRpars, fitOptions);
142146
save('EricModel_MMDex','GRpars')
143147
end
144148

149+
save('EricModelGR_MMDex','GRpars','combinedGRModel')
150+
145151
%% STEP 1.D. -- Compute FIM for GR parameters.
146152
combinedGRModel = combinedGRModel.computeFIMs([],'log');
147153
fimGR_withPrior = combinedGRModel.FIM.totalFIM+... % the FIM in log space.
148154
diag(1./(log10PriorStd(ModelGR.fittingOptions.modelVarsToFit)*log(10)).^2); % Add prior in log space.
149155

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.
151164
%GRpars = GRpars';
152165
MHFitOptions.thin=1;
153-
MHFitOptions.numberOfSamples=1000;
154-
MHFitOptions.burnIn=0;
166+
MHFitOptions.numberOfSamples=3000;
167+
MHFitOptions.burnIn=1000;
155168
MHFitOptions.progress=true;
156169
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.)
157173
MHFitOptions.useFIMforMetHast = false;
174+
MHFitOptions.proposalDistribution=@(x)mvnrnd(x,covFree);
175+
158176
MHFitOptions.saveFile = 'TMPEricMHGR.mat';
159177
[~,~,MHResultsGR] = combinedGRModel.maximizeLikelihood(...
160178
GRpars, MHFitOptions, 'MetropolisHastings');
161-
delete(MHFitOptions.saveFile)
179+
%delete(MHFitOptions.saveFile)
162180
%%
163181
figNew = figure;
164182
ModelGR.plotMHResults(MHResultsGR,[],'log',[],figNew)
@@ -171,9 +189,11 @@
171189
end
172190
end
173191

174-
%% STEP 1.D. -- Make Plots of GR Fit Results
192+
%% STEP 1.F. -- Make Plots of GR Fit Results
175193
makeGRPlots(combinedGRModel,GRpars)
176194

195+
save('EricModelGR_MMDex','GRpars','combinedGRModel','MHResultsGR')
196+
177197
%% STEP 2 -- Extend Model to Include DUSP1 Activation, Production, and Degradation
178198
if loadPrevious
179199
varNamesDUSP1 = {'ModelGRDusp100nM'
@@ -265,6 +285,7 @@
265285
ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars);
266286
save('EricModelDusp1_MMDex','GRpars','DUSP1pars')
267287
end
288+
268289
%% STEP 2.C. -- Plot predictions for other Dex concentrations.
269290
showCases = [1,1,1,1];
270291
makePlotsDUSP1({ModelGRDusp100nM},ModelGRDusp100nM,DUSP1pars,Dusp1FitCases,showCases)
@@ -310,185 +331,7 @@
310331
delete('TMPEricMHDusp1.mat')
311332
ModelGRDusp100nM.parameters(1:4,2) = num2cell(DUSP1pars);
312333
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'));
397334

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-
%%
492335
%% STEP 3. -- Model Extensions using ODE Analyses
493336
if loadPrevious
494337
vaNamesExtended = {'ModelGRfit'

0 commit comments

Comments
 (0)