|
| 1 | +%% Using the SSIT to fit and Design Single-Cell Experiments |
| 2 | +% In this script, we show how the SSIT can be used to identify a |
| 3 | +% time-inhomogeneous model for the activation of Dusp1 mRNA expression |
| 4 | +% under Dexamethasome stimulation of Glucocorticoid Receptors. |
| 5 | + clear all |
| 6 | + clc |
| 7 | + addpath(genpath('../../src')); |
| 8 | + DATAFILE = 'datasetDavidKingJan2024'; |
| 9 | +%% Define SSIT Model |
| 10 | + Model0 = SSIT; |
| 11 | + Model0.species = {'elt2';... % endogenous ELT-2. Unobserved. |
| 12 | + 'elt7';... % endogenous ELT-7. Unobserved. |
| 13 | + 'gfp'}; % GFP, run off of elt-2 promoter. This is our observed variable. |
| 14 | + Model0.initialCondition = [0;0;0]; |
| 15 | + Model0.propensityFunctions = { |
| 16 | + 'kelt2*(1 + elt7)/(promoter_alpha+elt7)*promoter_beta/(promoter_beta+elt2)'; ... % ELT-2 |
| 17 | + 'gelt2*elt2';... % degradation |
| 18 | + 'kelt7';... % ELT-7 |
| 19 | + 'gelt7*elt7';... % degradation |
| 20 | + 'kgfp*(1 + elt7)/(promoter_alpha+elt7)*promoter_beta/(promoter_beta+elt2)';... % GFP |
| 21 | + 'ggfp*gfp'}; %GFP |
| 22 | + Model0.stoichiometry = [1,-1,0,0,0,0;... |
| 23 | + 0,0,1,-1,0,0;... |
| 24 | + 0,0,0,0,1,-1]; |
| 25 | + |
| 26 | + Model0.parameters = ({ ... |
| 27 | + 'kelt2',1;... |
| 28 | + 'kelt7',1;... |
| 29 | + 'kgfp',1;... |
| 30 | + 'gelt2',1;... |
| 31 | + 'gelt7',1;... |
| 32 | + 'ggfp',16;... |
| 33 | + 'promoter_alpha',5; ... |
| 34 | + 'promoter_beta',10}); |
| 35 | + |
| 36 | +%% set FSP and other settings |
| 37 | +disp("Setting parameters.") |
| 38 | +Model0.fspOptions.initApproxSS = true; |
| 39 | +Model0.tSpan=[0,100]; |
| 40 | + |
| 41 | +Model0.solutionScheme = 'FSP'; |
| 42 | +Model0.fspOptions.fspTol = 1e-3; |
| 43 | +disp('Writing propensity functions') |
| 44 | +Model0 = Model0.formPropensitiesGeneral('DavidKing'); |
| 45 | + |
| 46 | +[~,Model0.fspOptions.bounds] = Model0.solve; |
| 47 | +Model0.fspOptions.bounds(6) = max(30,Model0.fspOptions.bounds(6)); |
| 48 | + |
| 49 | +%% Load and Fit GFP reporter data |
| 50 | +disp("Loading WT data."); |
| 51 | +Model1 = Model0.loadData(DATAFILE,{'gfp','IntensityIntegers'},... |
| 52 | + {'Genotype','ELT-2-GFP';'RNAi','L4440'}); |
| 53 | +Model1.fittingOptions.modelVarsToFit = [1:8]; |
| 54 | + |
| 55 | +disp("Loading elt7 KO data."); |
| 56 | +Model2 = Model0.loadData(DATAFILE,{'gfp','IntensityIntegers'; 'elt7', 'zeroes'},... |
| 57 | + {'Genotype','ELT-7-KO';'RNAi','L4440'}); |
| 58 | +Model2.parameters(2,:) = {'kelt7',0}; |
| 59 | +% define parameters that are in model 2. |
| 60 | +M2parInds = [1,3,4,6,8]; |
| 61 | +Model2.fittingOptions.modelVarsToFit = M2parInds; |
| 62 | + |
| 63 | +%% |
| 64 | +[~,Model1.fspOptions.bounds] = Model1.solve; |
| 65 | +[~,Model2.fspOptions.bounds] = Model2.solve; |
| 66 | + |
| 67 | +mu = zeros(size(Model0.parameters,1),1); % log means |
| 68 | +sig2 = ones(size(Model0.parameters,1),1); |
| 69 | + |
| 70 | +% Model1.fittingOptions.logPrior = @(x)sum(-(log10(x)-mu).^2./(2*sig2)); |
| 71 | +% Model2.fittingOptions.logPrior = @(x)sum(-(log10(x)-mu([1,3,4,6,8])).^2./(2*sig2(M2parInds))); |
| 72 | + |
| 73 | +%% setting up the fit |
| 74 | +% initial guess |
| 75 | +pars0 = [Model0.parameters{:,2}]; |
| 76 | +fitOptions = optimset('Display','iter','MaxIter',100); |
| 77 | +obj = @(x)-(Model1.computeLikelihood(exp(x))+Model2.computeLikelihood(exp(x(M2parInds)))); |
| 78 | +initial_error = obj(log(pars0)) |
| 79 | + |
| 80 | +%% fit |
| 81 | +disp("Fitting..."); |
| 82 | + |
| 83 | +% load ParsBrian pars0 |
| 84 | +for iRound = 1:5 |
| 85 | + pars0 = exp(fminsearch(obj,log(pars0),fitOptions)) |
| 86 | + |
| 87 | + Model1.parameters(:,2) = num2cell(pars0); |
| 88 | + Model2.parameters(M2parInds,2) = num2cell(pars0(M2parInds)); |
| 89 | + |
| 90 | + [soln1,Model1.fspOptions.bounds] = Model1.solve; |
| 91 | + Model1.fspOptions.bounds(6) = max(30,Model1.fspOptions.bounds(6)); |
| 92 | + [~,~,soln1] = Model1.computeLikelihood([],soln1.stateSpace); |
| 93 | + |
| 94 | + [soln2,Model2.fspOptions.bounds] = Model2.solve; |
| 95 | + [~,~,soln2] = Model2.computeLikelihood([],soln2.stateSpace); |
| 96 | + Model2.fspOptions.bounds(6) = max(30,Model2.fspOptions.bounds(6)); |
| 97 | + |
| 98 | + Model1.makeFitPlot(soln1,1); |
| 99 | + Model2.makeFitPlot(soln2,1); |
| 100 | +end |
| 101 | + |
| 102 | +% save ParsBrian pars0 |
| 103 | + |
| 104 | + |
| 105 | + |
| 106 | +% Model0.parameters(Model0.fittingOptions.modelVarsToFit,2) = num2cell(Model0.maximizeLikelihood([],fitOptions)); |
| 107 | + |
| 108 | +%% plot |
| 109 | +% disp("Plotting..."); |
| 110 | +% [fspSoln,Model0.fspOptions.bounds] = Model0.solve; |
| 111 | +% Model0.makeFitPlot([],1); % makeSeparatePlotOfData last worked on commit 20a9bbe, not subsequent: 0055cc |
| 112 | +% Error with 0055cc: |
| 113 | +% Attempt to grow array along ambiguous dimension. |
| 114 | +% |
| 115 | +% Error in makeSeparatePlotOfData (line 87) |
| 116 | +% H1(end+1)=0; |
| 117 | + |
0 commit comments