internal void UpdateGeneratedValues(YGen genY) { int begin, len, p; p = (int)Measure.MeasureType.GreaterThan; begin = Positions[p].Start; len = Positions[p].Length; for (int i = 0; i < len; i++) { df[begin + i].GenValue = this.logNormalDistrn ? genY.LogGT[i] : genY.GT[i]; } p = (int)Measure.MeasureType.LessThan; begin = Positions[p].Start; len = Positions[p].Length; for (int i = 0; i < len; i++) { df[begin + i].GenValue = this.logNormalDistrn ? genY.LogLT[i] : genY.LT[i]; } p = (int)Measure.MeasureType.Interval; begin = Positions[p].Start; len = Positions[p].Length; for (int i = 0; i < len; i++) { df[begin + i].GenValue = this.logNormalDistrn ? genY.LogI[i] : genY.I[i]; } UpdatePublicProperties(); }
internal static YGen Inits(DataSummary data, double mu, double sigma, bool meThroughCV, bool logNormalDistrn) { YGen newYGen = new YGen(); if (logNormalDistrn) { if (data.AnyGT) { newYGen.LogGT = RNorm4CensoredMeasures.RNormCensored(mu, sigma, lower: data.LogGT); newYGen.GT = newYGen.LogGT.Exp(); } if (data.AnyLT) { newYGen.LogLT = RNorm4CensoredMeasures.RNormCensored(mu, sigma, upper: data.LogLT, negativeDisallowed: meThroughCV && !logNormalDistrn); newYGen.LT = newYGen.LogLT.Exp(); } if (data.AnyIntervalCensored) { newYGen.LogI = RNorm4CensoredMeasures.RNormCensored(mu, sigma, lower: data.LogIntervalGT, upper: data.LogIntervalLT); newYGen.I = newYGen.LogI.Exp(); } } else { if (data.AnyGT) { newYGen.GT = RNorm4CensoredMeasures.RNormCensored(mu, sigma, lower: data.GT); } if (data.AnyLT) { newYGen.LT = RNorm4CensoredMeasures.RNormCensored(mu, sigma, upper: data.LT, negativeDisallowed: meThroughCV && !logNormalDistrn); } if (data.AnyIntervalCensored) { newYGen.I = RNorm4CensoredMeasures.RNormCensored(mu, sigma, lower: data.IntervalGT, upper: data.IntervalLT); } } return(newYGen); }
public static YGen GetInstance(MeasurementError me, TrueValuesGen genTV, DataSummary data, double mu, double sigma, bool logNormalDistrn = true) { if (me.Any) { YGen newYGen = new YGen(); // Sample y (censored) values | true values if (data.AnyGT) { double[] tmpMean = genTV.GT; double[] tmpSD; if (me.ThroughCV) { tmpSD = tmpMean.Multiply(me.Parm); } else { tmpSD = Tools.Rep(me.Parm, tmpMean.Length); } newYGen.GT = RNorm4CensoredMeasures.RNormCensored(tmpMean, tmpSD, lower: data.GT); if (logNormalDistrn) { newYGen.LogGT = newYGen.GT.Log(); } } if (data.AnyLT) { double[] tmpMean = genTV.LT; double[] tmpSD; if (me.ThroughCV) { tmpSD = tmpMean.Multiply(me.Parm); } else { tmpSD = Tools.Rep(me.Parm, tmpMean.Length); } newYGen.LT = RNorm4CensoredMeasures.RNormCensored(tmpMean, tmpSD, upper: data.LT, negativeDisallowed: logNormalDistrn || me.ThroughCV); if (logNormalDistrn) { newYGen.LogLT = newYGen.LT.Log(); } } if (data.AnyIntervalCensored) { double[] tmpMean = genTV.I; double[] tmpSD; if (me.ThroughCV) { tmpSD = tmpMean.Multiply(me.Parm); } else { tmpSD = Tools.Rep(me.Parm, tmpMean.Length); } newYGen.I = RNorm4CensoredMeasures.RNormCensored(tmpMean, tmpSD, lower: data.IntervalGT, upper: data.IntervalLT); if (logNormalDistrn) { newYGen.LogI = newYGen.I.Log(); } } return(newYGen); } else { return(YGen.Inits(data, mu, sigma, meThroughCV: data.METhroughCV, logNormalDistrn: logNormalDistrn)); } }
private TrueValuesGen(YGen genY, DataSummary data, double mu, double sigma, MeasurementError me, bool logNormalDistrn = true, GenObject o = null) { if (me.ThroughSD && !logNormalDistrn) { double meSD = me.Parm; double tauStar = 1 / Math.Pow(sigma, 2) + 1 / Math.Pow(meSD, 2); double sdStar = 1 / Math.Sqrt(tauStar); if (data.YLength > 0) { double[] tmpMean = (data.Y.Divide(Math.Pow(meSD, 2)).Add(mu / Math.Pow(sigma, 2))).Divide(tauStar); this.Y = NormalDistribution.RNorm(data.YLength, tmpMean, Tools.Rep(sdStar, tmpMean.Length)); } if (data.GTLength > 0) { double[] tmpMean = (genY.GT.Divide(Math.Pow(meSD, 2)).Add(mu / Math.Pow(sigma, 2))).Divide(tauStar); this.Y = NormalDistribution.RNorm(data.GTLength, tmpMean, Tools.Rep(sdStar, tmpMean.Length)); } if (data.LTLength > 0) { double[] tmpMean = (genY.LT.Divide(Math.Pow(meSD, 2)).Add(mu / Math.Pow(sigma, 2))).Divide(tauStar); this.Y = NormalDistribution.RNorm(data.GTLength, tmpMean, Tools.Rep(sdStar, tmpMean.Length)); } if (data.IntervalLength > 0) { double[] tmpMean = (genY.I.Divide(Math.Pow(meSD, 2)).Add(mu / Math.Pow(sigma, 2))).Divide(tauStar); this.Y = NormalDistribution.RNorm(data.GTLength, tmpMean, Tools.Rep(sdStar, tmpMean.Length)); } } else { o.A.Sigma2 = sigma * sigma; this.Y = new double[data.YLength]; this.GT = new double[data.GTLength]; this.LT = new double[data.LTLength]; this.I = new double[data.IntervalLength]; for (int j = 0; j < data.YLength; j++) { this.Y[j] = TrueValueGen(o, me, data.Y[j], mu, logY: logNormalDistrn?data.LogY[j] : Tools.ND); } for (int j = 0; j < data.GTLength; j++) { this.GT[j] = TrueValueGen(o, me, genY.GT[j], mu, logY: logNormalDistrn?genY.LogGT[j] : Tools.ND); } for (int j = 0; j < data.LTLength; j++) { this.LT[j] = TrueValueGen(o, me, genY.LT[j], mu, logY: logNormalDistrn?genY.LogLT[j] : Tools.ND); } for (int j = 0; j < data.IntervalLength; j++) { this.I[j] = TrueValueGen(o, me, genY.I[j], mu, logY: logNormalDistrn?genY.LogI[j] : Tools.ND); } if (logNormalDistrn) { this.LogY = this.Y.Log(); this.LogGT = this.GT.Log(); this.LogLT = this.LT.Log(); this.LogI = this.I.Log(); } } } //# end of truevalues.gen
} //# end of truevalues.gen internal static TrueValuesGen GetInstance(YGen genY, DataSummary data, double mu, double sigma, MeasurementError me, bool logNormalDistrn = true, GenObject o = null) { return(new TrueValuesGen(genY, data, mu, sigma, me, logNormalDistrn, o)); }
}// end constructor /* * La méthode étant internal, elle peut être invoquée d'un programme externe à la librairie. * La seule méthode qui peut invoquer Run, c'est la méthode Compute de Model qui ne le fera que si le modèle est * jugé valide. */ internal override void Run() { SGNFnAParam localA = null; GenObject oTV = null; GenObject oMu = null; GenObject oSigma = null; GenObject oME = null; YGen genY = YGen.EmptyInstance; TrueValuesGen genTV = null; double[] burninMu; double[] burninSigma; double[] burninCV = null; double[] sampleMu; double[] sampleSigma; double[] sampleCV = null; double mu; double sigma; int iter = -1, savedIter; double muCondMean; double yBar; double muCondSD; double[] pLim = new double[2]; double p; double[] muLim = new double[] { this.MuLower, this.MuUpper }; double logSigmaSD; try { logSigmaSD = 1 / Math.Sqrt(this.LogSigmaPrec); if (ME.Any) { if (ME.ThroughCV) { if (OutcomeIsLogNormallyDistributed) { oTV = new TrueValue_CV_LogN_GenObject(); } else { oTV = new TrueValue_CV_Norm_GenObject(); } } else { //oTV = new TrueValue_SD_GenObject(); } } //# modif_0.12 int combinedN = this.Data.N + (this.PastData.Defined ? PastData.N : 0); if (ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { oMu = new MuTruncatedData_GenObject(combinedN); //# modif_0.12 oSigma = GenObject.GetSigmaTruncatedDataLNormGenObject(combinedN, this.LogSigmaMu, logSigmaSD); //# modif_0.12 } else { oSigma = GenObject.GetSigmaGenObject(combinedN, this.LogSigmaMu, logSigmaSD); //# modif_0.12 } localA = oSigma.A.Clone(); if (ME.Any && !ME.Known) { oME = GenObject.GetMeGenObject(this.ME, this.OutcomeIsLogNormallyDistributed, this.Data.N); } int nIterations = NBurnin + NIter * NThin; //les tableaux pour les chaines sampleMu = Result.Chains.GetChain("muSample"); sampleSigma = Result.Chains.GetChain("sdSample"); burninMu = Result.Chains.GetChain("muBurnin"); burninSigma = Result.Chains.GetChain("sdBurnin"); if (ME.ThroughCV) { sampleCV = Result.Chains.GetChain("cvSample"); burninCV = Result.Chains.GetChain("cvBurnin"); } bool inestimableLowerLimit = false; //Initial values for mu and sigma mu = InitMu; sigma = InitSigma; savedIter = 0; // pour les échantillons if (this.Data.AnyCensored) { genY = YGen.Inits(this.Data, mu, sigma, meThroughCV: this.ME.ThroughCV, logNormalDistrn: OutcomeIsLogNormallyDistributed); } if (ME.Any) { ME.Parm = ME.InitialValue; } //Boucle principale for (iter = 0; iter < nIterations; iter++) { if (ME.Any) { genTV = TrueValuesGen.GetInstance(genY, this.Data, mu, sigma, this.ME, logNormalDistrn: OutcomeIsLogNormallyDistributed, o: oTV); } if (this.Data.AnyCensored) { //y.gen(true.values, data, sigma, me, outcome.is.logNormally.distributed, mu=mu) //On ne tient pas compte de true.values, ni de me ... genY = YGen.GetInstance(this.ME, genTV, this.Data, mu, sigma, OutcomeIsLogNormallyDistributed); } OutLogoutMoments moments = OutLogoutMoments.Get(this.ME.Any, this.OutcomeIsLogNormallyDistributed, this.Data, genY, genTV); double sigmaBeta = (moments.Sum2 - 2 * mu * moments.Sum + this.Data.N * mu * mu) / 2.0; if (PastData.Defined) { sigmaBeta = sigmaBeta + PastData.N / 2.0 * Math.Pow(PastData.Mean - mu, 2) + PastData.NS2 / 2.0; } double[] start = new double[0]; if (this.ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { //ici // A <- c(o.sigma$A, list(b=sigma.beta, mu=mu)) localA = oSigma.A.Clone(); localA.B = sigmaBeta; localA.Mu = mu; start = Tools.Combine(sigma); inestimableLowerLimit = false; } else { localA.B = sigmaBeta; start = oSigma.Start(localA); inestimableLowerLimit = true; } Icdf icdf = new Icdf(oSigma, localA, Tools.Combine(0, double.PositiveInfinity)); sigma = icdf.Bidon(start, inestimableLowerLimit); yBar = moments.Sum / this.Data.N; muCondMean = this.PastData.Defined ? (moments.Sum + PastData.N * PastData.Mean) / combinedN : yBar; // # new_0.12 if (this.ME.ThroughCV && !this.OutcomeIsLogNormallyDistributed) { mu = MuTruncatedGen.GetInstance(oMu, muLim, muCondMean, sigma).Mu; } else { muCondSD = sigma / Math.Sqrt(combinedN); pLim = NormalDistribution.PNorm(muLim.Substract(muCondMean).Divide(muCondSD)); p = UniformDistribution.RUnif(1, pLim[0], pLim[1])[0]; mu = NormalDistribution.QNorm(p, mu: muCondMean, sigma: muCondSD); } //# Sample Measurement Error from its posterior density if (this.ME.Any && !this.ME.Known) { this.ME.Parm = MEParmGen.GetInstance(oME, this.ME, this.Data, genY, genTV).Parm; } if (iter < NBurnin) { if (MonitorBurnin) { burninMu[iter] = mu; burninSigma[iter] = sigma; if (this.ME.Any && !this.ME.Known) { burninCV[iter] = ME.Parm; } } } else if ((iter - NBurnin) % NThin == 0) { sampleMu[savedIter] = mu; sampleSigma[savedIter] = sigma; if (this.ME.Any && !this.ME.Known) { sampleCV[savedIter] = ME.Parm; } savedIter++; } }// for( int iter = 1 ... } catch (Exception ex) { this.Result.Messages.AddError(WEException.GetStandardMessage(ex, iter, Result.PRNGSeed), this.ClassName); return; } } //end Run
}// end constructor internal override void Run() { YGen genY = YGen.EmptyInstance; // Pourra probablement prendre plusieurs formes. TrueValuesGen genTV = null; GenObject oSigma = EmptyGenObject.Instance; GenObject oMu = EmptyGenObject.Instance; GenObject oME = null; GenObject oTV = null; double[] burninMu; double[] burninSigma; double[] burninCV = null; double[] sampleMu; double[] sampleSigma; double[] sampleCV = null; double mu; double sigma; int iter = -1, savedIter; double muCondMean; double muCondSD; try { //# Prepare dens.gen.icdf objects if (ME.Any) { if (ME.ThroughCV) { if (OutcomeIsLogNormallyDistributed) { oTV = new TrueValue_CV_LogN_GenObject(); } else { oTV = new TrueValue_CV_Norm_GenObject(); } } else { //oTV = new TrueValue_SD_GenObject(); } } if (ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { oMu = new MuTruncatedData_GenObject(this.Data.N); //# modif_0.12 oSigma = GenObject.GetSigmaTruncatedDataGenObject(this.Data.N); //# modif_0.12 } else { oSigma = EmptyGenObject.Instance; } if (ME.Any && !ME.Known) { oME = GenObject.GetMeGenObject(this.ME, this.OutcomeIsLogNormallyDistributed, this.Data.N); } int nIterations = NBurnin + NIter * NThin; //les tableaux pour les chaines sampleMu = Result.Chains.GetChain("muSample"); sampleSigma = Result.Chains.GetChain("sdSample"); burninMu = Result.Chains.GetChain("muBurnin"); burninSigma = Result.Chains.GetChain("sdBurnin"); if (ME.ThroughCV) { sampleCV = Result.Chains.GetChain("cvSample"); burninCV = Result.Chains.GetChain("cvBurnin"); } //Initial values for mu and sigma mu = this.InitMu; sigma = this.InitSD; //# Initialize measured values for subjects with censored values [modif_0.10] if (this.Data.AnyCensored) { genY = YGen.Inits(data: this.Data, mu: mu, sigma: sigma, meThroughCV: true, logNormalDistrn: OutcomeIsLogNormallyDistributed); } if (ME.Any) { ME.Parm = ME.InitialValue; } //# Start MCMC savedIter = 0; // pour les échantillons for (iter = 0; iter < nIterations; iter++) { //# Sample true values (in presence of measurement error) [new_0.10] if (ME.Any) { genTV = TrueValuesGen.GetInstance(genY, this.Data, mu, sigma, this.ME, OutcomeIsLogNormallyDistributed, o: oTV); } //# Sample y values for censored observations if (this.Data.AnyCensored) { //y.gen(true.values, data, sigma, me, outcome.is.logNormally.distributed, mu=mu) //On ne tient pas compte de true.values, ni de me ... genY = YGen.GetInstance(this.ME, genTV, this.Data, mu, sigma, OutcomeIsLogNormallyDistributed); } //# Compute data points sum and square sum OutLogoutMoments moments = OutLogoutMoments.Get(this.ME.Any, this.OutcomeIsLogNormallyDistributed, this.Data, genY, genTV); //# Sample from f(sigma | mu) //# modif_0.10 double sigmaBeta = (moments.Sum2 - 2 * mu * moments.Sum + this.Data.N * mu * mu) / 2.0; if (sigmaBeta < 1e-6) { sigmaBeta = 0; // # protection against numeric imprecision } if (this.ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { sigma = SigmaTruncatedDataGen.GetInstance(oSigma, SDRange, sigmaBeta, mu, sigma).Sigma; } else { sigma = WebExpoFunctions3.SqrtInvertedGammaGen(Data.N, sigmaBeta, this.SDRange, oSigma); } muCondMean = moments.Sum / this.Data.N; if (this.ME.ThroughCV && !this.OutcomeIsLogNormallyDistributed) { mu = MuTruncatedGen.GetInstance(oMu, Tools.Combine(MuLower, MuUpper), muCondMean, sigma).Mu; } else { muCondSD = sigma / Math.Sqrt(this.Data.N); mu = RNorm4CensoredMeasures.RNormCensored(muCondMean, muCondSD, lower: this.MuLower, upper: this.MuUpper); } //# Sample Measurement Error from its posterior density if (this.ME.Any && !ME.Known) { this.ME.Parm = MEParmGen.GetInstance(oME, this.ME, this.Data, genY, genTV).Parm; } if (iter < NBurnin) { if (MonitorBurnin) { burninMu[iter] = mu; burninSigma[iter] = sigma; if (this.ME.Any && !this.ME.Known) { burninCV[iter] = ME.Parm; } } } else if ((iter - NBurnin) % NThin == 0) { sampleMu[savedIter] = mu; sampleSigma[savedIter] = sigma; if (this.ME.Any && !this.ME.Known) { sampleCV[savedIter] = ME.Parm; } savedIter++; } }// for( int iter = 1 ... } catch (Exception ex) { this.Result.Messages.AddError(WEException.GetStandardMessage(ex, iter, Result.PRNGSeed), this.ClassName); return; } }//compute
public static OutLogoutMoments Get(bool anyME, bool logNormalDistrn, DataSummary data, YGen genY, TrueValuesGen genTV) { OutLogoutMoments olm = new OutLogoutMoments(); if (anyME) { double[] y; if (logNormalDistrn) { y = Tools.Combine(genTV.LogY, genTV.LogGT, genTV.LogLT, genTV.LogI); } else { y = Tools.Combine(genTV.Y, genTV.GT, genTV.LT, genTV.I); } olm.Sum = y.Sum(); olm.Sum2 = y.Sqr().Sum(); return(olm); } else if (logNormalDistrn) { olm.Sum = data.LogUncensoredSum; olm.Sum2 = data.LogUncensoredSum2; olm.Sum += genY.LogGT.Sum() + genY.LogLT.Sum() + genY.LogI.Sum(); olm.Sum2 += genY.LogGT.Sqr().Sum() + genY.LogLT.Sqr().Sum() + genY.LogI.Sqr().Sum(); } else { olm.Sum = data.UncensoredSum; olm.Sum2 = data.UncensoredSum2; olm.Sum += genY.GT.Sum() + genY.LT.Sum() + genY.I.Sum(); olm.Sum2 += genY.GT.Sqr().Sum() + genY.LT.Sqr().Sum() + genY.I.Sqr().Sum(); } return(olm); }
internal static MEParmGen GetInstance(GenObject o, MeasurementError me, DataSummary data, YGen genY, TrueValuesGen genTV) { MEParmGen instance = new MEParmGen(); double b; double[] tmpY, tmpT; if (me.ThroughCV) { if (o.LogNormalDistrn) { tmpY = Tools.Combine(data.LogY, genY.LogGT, genY.LogLT, genY.LogI); tmpT = Tools.Combine(genTV.LogY, genTV.LogGT, genTV.LogLT, genTV.LogI); b = tmpY.Substract(tmpT).Exp().Substract(1.0).Sqr().Sum(); b /= 2.0; } else { tmpY = Tools.Combine(data.Y, genY.GT, genY.LT, genY.I); tmpT = Tools.Combine(genTV.Y, genTV.GT, genTV.LT, genTV.I); b = tmpY.Divide(tmpT).Substract(1.0).Sqr().Reverse().Sum(); b /= 2.0; } SGNFnAParam localA = o.A.Clone(); localA.B = b; localA.Range = me.GetRange(); double[] range = me.GetRange(); Icdf icdf = new Icdf(o, localA, range); instance.Parm = icdf.Bidon(o.Start(localA), inestLowerLim: range[0] == 0); } else { tmpY = Tools.Combine(data.Y, genY.GT, genY.LT, genY.I); tmpT = Tools.Combine(genTV.Y, genTV.GT, genTV.LT, genTV.I); b = tmpY.Substract(tmpT).Sqr().Sum(); b /= 2.0; if (o.LogNormalDistrn) { SGNFnAParam localA = o.A.Clone(); localA.B = b; localA.Range = me.GetRange(); localA.Truevalues = Tools.Copy(tmpT); //me.parm <- dens.gen.icdf(o, A, range=me$range, inestimable.lower.limit=me$range[1]==0) double[] range = me.GetRange(); Icdf icdf = new Icdf(o, localA, range); instance.Parm = icdf.Bidon(inestLowerLim: range[0] == 0.0); } else { instance.Parm = WebExpoFunctions3.SqrtInvertedGammaGen(data.N, b, me.GetRange(), o); } } return(instance); }
internal YGen GenYLocal(double[] muWorker, double mu, double sigma) { YGen rep = YGen.GetEmptyObject(); if (this.parentModel.ME.Any) { //TODO non implanté return(null); } else { if (this.logNormalDistrn) { if (Data.AnyGT) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.GreaterThan].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.LogGT.Length; rep.GT = new double[len]; rep.LogGT = new double[len]; for (int i = 0; i < len; i++) { rep.LogGT[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, lower: this.Data.LogGT[i]); } rep.GT = rep.LogGT.Exp(); } if (Data.AnyLT) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.LessThan].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.LogLT.Length; rep.LT = new double[len]; rep.LogLT = new double[len]; for (int i = 0; i < len; i++) { rep.LogLT[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, upper: this.Data.LogLT[i]); } rep.LT = rep.LogLT.Exp(); } if (Data.AnyIntervalCensored) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.Interval].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.LogIntervalGT.Length; rep.I = new double[len]; rep.LogI = new double[len]; for (int i = 0; i < len; i++) { rep.LogI[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, lower: this.Data.LogIntervalGT[i], upper: this.Data.LogIntervalLT[i]); } rep.I = rep.LogI.Exp(); } } else { if (Data.AnyGT) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.GreaterThan].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.GT.Length; rep.GT = new double[len]; for (int i = 0; i < len; i++) { rep.GT[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, lower: this.Data.GT[i]); } } if (Data.AnyLT) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.LessThan].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.LT.Length; rep.LT = new double[len]; for (int i = 0; i < len; i++) { rep.LT[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, upper: this.Data.LT[i]); } } if (Data.AnyIntervalCensored) { int[] workerIds = DFRecordByMeasureType[Measure.MeasureType.Interval].Select(rec => rec.WorkerOrdinal).ToArray(); double[] means = muWorker.Extract(workerIds).Add(mu); int len = this.Data.IntervalGT.Length; rep.I = new double[len]; rep.LogI = new double[len]; for (int i = 0; i < len; i++) { rep.I[i] = RNorm4CensoredMeasures.RNormCensored(means[i], sigma, lower: this.Data.IntervalGT[i], upper: this.Data.IntervalLT[i]); } } } } return(rep); }//# end of y.gen.local
internal override void Run() { ChainNamePair b_s; b_s = Mcmc.GetChainNames("muOverall"); double[] muOverallBurnin = Result.Chains.GetChain(b_s.Burnin); double[] muOverallSample = Result.Chains.GetChain(b_s.Sample); b_s = Mcmc.GetChainNames("sigmaWithin"); double[] sigmaWithinBurnin = Result.Chains.GetChain(b_s.Burnin); double[] sigmaWithinSample = Result.Chains.GetChain(b_s.Sample); b_s = Mcmc.GetChainNames("sigmaBetween"); double[] sigmaBetweenBurnin = Result.Chains.GetChain(b_s.Burnin); double[] sigmaBetweenSample = Result.Chains.GetChain(b_s.Sample); double[][] workerBurnin = new double[Data.NWorkers][]; double[][] workerSample = new double[Data.NWorkers][]; int iTag = 0; foreach (string tag in Data.WorkersByTag.Keys) { b_s = Mcmc.GetWorkerChainNames(tag); workerBurnin[iTag] = Result.Chains.GetChain(b_s.Burnin); workerSample[iTag] = Result.Chains.GetChain(b_s.Sample); iTag++; } int iter = -1, savedIter = 0; try { double logSigmaWithinSD = 1 / Math.Sqrt(LogSigmaWithinPrec); double logSigmaBetweenSD = 1 / Math.Sqrt(LogSigmaBetweenPrec); //# Prepare dens.gen.icdf objects if (this.ME.Any) { //o.tv < -truevalue.gen.object(me, outcome.is.logNormally.distributed) } if (this.ME.ThroughCV && !this.OutcomeIsLogNormallyDistributed) { //o.mu.overall < -mu.truncatedData.gen.local.object(data$N, data$worker$count) //o.mu.worker < -mu.worker.truncatedData.gen.object(data$worker$count) } GenObject oSB = null, oSW = null; if (this.UseUniformPriorOnSds) { if (Data.NWorkers <= 1) { oSB = new Sigma_woLM_GenObject(Data.NWorkers); } else { oSB = null; } } else { oSB = new Sigma_LM_GenObject(Data.NWorkers, this.LogSigmaBetweenMu, logSigmaBetweenSD); } if (this.ME.ThroughCV && !this.OutcomeIsLogNormallyDistributed) { //if (use.uniform.prior.on.sds) //{ // o.sw < -sigma.within.truncatedData.gen.object(data$N, data$worker$count, T, range = sigma.within.range) //} //else //{ // o.sw < -sigma.within.truncatedData.gen.object(data$N, data$worker$count, F, lnorm.mu = log.sigma.within.mu, lnorm.sd = log.sigma.within.sd) //} } else { if (this.UseUniformPriorOnSds) { if (Data.N <= 1) { oSW = new Sigma_woLM_GenObject(Data.N); } else { oSW = null; } } else { oSW = new Sigma_LM_GenObject(this.Data.N, lNormMu: this.LogSigmaWithinMu, lNormSd: logSigmaWithinSD); } } if (this.ME.Any && !this.ME.Known) { //o.me < -me.gen.object(me, outcome.is.logNormally.distributed, data$N) } double muOverall = this.InitMuOverall; double sigmaWithin = InitSigmaWithin; //# Initialize measured values for subjects with censored values [new_0.10] YGen genY = YGen.GetEmptyObject(); WorkerData workerData = new WorkerData(this); this.ResultParams = new Object[1]; this.ResultParams[0] = this.Data.WorkersByTag.Keys; if (this.Data.AnyCensored) { genY = YGen.Inits(data: this.Data, mu: muOverall, sigma: sigmaWithin, meThroughCV: false, logNormalDistrn: OutcomeIsLogNormallyDistributed); workerData.UpdateGeneratedValues(genY); } double[] muWorker = workerData.MuWorker; workerData.AdjustMuOverall(this.MuOverallLower, this.MuOverallUpper); muOverall = workerData.MuOverall; muWorker = muWorker.Substract(muOverall); // # center mu.worker double[] predicted = workerData.GetPredictedMeans(muOverall); sigmaWithin = workerData.GetSigmaWithin(); int nIterations = NBurnin + NIter * NThin; for (iter = 0; iter < nIterations; iter++) { if (this.ME.Any) { //true.values < -truevalues.gen.local(gen.y, data, me, mu.worker, o = o.tv) } //# Sample y values for censored observations if (this.Data.AnyCensored) { //function(true.values, data, me, mu.worker, mu=mu.overall, sigma=sigma.within, logNormal.distrn=outcome.is.logNormally.distributed) genY = workerData.GenYLocal(muWorker, muOverall, sigmaWithin); workerData.UpdateGeneratedValues(genY); } double[] yWorkerAvg = workerData.MuWorker; double yAvg = workerData.Average; //# Sample from f(sigma.within | other parms) double[] residuals = workerData.GetGenValues().Substract(muWorker.Extract(workerData.WorkerIds)).Substract(muOverall); double b = residuals.Sqr().ToArray().Sum() / 2.0; SGNFnAParam localA = null; if (this.ME.ThroughCV && !this.OutcomeIsLogNormallyDistributed) { //A < -c(o.sw$A, list(b = b, mu = mu.overall, muk = mu.worker)) //sigma.within < -dens.gen.icdf(o.sw, A, range = o.sw$range, start = sigma.within, inestimable.lower.limit = o.sw$inestimable.lower.limit) } else { if (this.UseUniformPriorOnSds) { sigmaWithin = WebExpoFunctions3.SqrtInvertedGammaGen(Data.N, b, SigmaWithinRange.Copy(), oSW); } else { localA = oSW.A.Clone(); localA.B = b; localA.Mu = muOverall; localA.Muk = muWorker; Icdf icdf = new Icdf(oSW, localA, range: Tools.Combine(0, double.PositiveInfinity)); sigmaWithin = icdf.Bidon(start: oSW.Start(localA), inestLowerLim: true); } } //# Sample from f(sigma.between | other parms) b = muWorker.Sqr().Sum() / 2.0; double sigmaBetween = 0; if (UseUniformPriorOnSds) { sigmaBetween = WebExpoFunctions3.SqrtInvertedGammaGen(Data.NWorkers, b, this.SigmaBetweenRange.Copy(), oSB); } else { localA = oSB.A.Clone(); localA.B = b; Icdf icdf = new Icdf(oSB, localA, range: Tools.Combine(0, double.PositiveInfinity)); sigmaBetween = icdf.Bidon(start: oSB.Start(localA), inestLowerLim: true); } //# Sample from f(mu.overall | other parms) //# modif_0.10 double tmpMean = yAvg - (muWorker.Multiply(this.Data.WorkerCounts).Sum() / this.Data.N); if (this.ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { //muOverall = mu.truncatedData.gen.local(o.mu.overall, tmp.mean, sigma.within, mu.worker, mu.overall.range, current.value = mu.overall) } else { double tmpSD = sigmaWithin / Math.Sqrt(this.Data.N); muOverall = RNorm4CensoredMeasures.RNormCensored(tmpMean, tmpSD, lower: this.MuOverallLower, upper: this.MuOverallUpper); } //# Sample from f(mu.worker's | other parms) //# modif_0.10 double[] sigma2A = Tools.Rep(Math.Pow(sigmaWithin, 2.0), this.Data.NWorkers).Divide(this.Data.WorkerCounts); // # vector of length '# of workers' double sigma2B = Math.Pow(sigmaBetween, 2); // # scalar double[] muA = yWorkerAvg.Substract(muOverall); // # vector of length '# of workers' double[] mukStar = muA.Multiply(sigma2B).Divide(sigma2A.Add(sigma2B)); // # vector of length '# of workers' double[] s2kStar = sigma2A.Multiply(sigma2B).Divide(sigma2A.Add(sigma2B)); // # vector of length '# of workers' if (this.ME.ThroughCV && !OutcomeIsLogNormallyDistributed) { //muWorker = mu.worker.truncatedData.gen(o.mu.worker, muk.star, s2k.star, mu.overall, sigma.within, mu.worker) } else { muWorker = NormalDistribution.RNorm(this.Data.NWorkers, mu: mukStar, sigma: s2kStar.Sqrt()); } if (iter < NBurnin) { if (MonitorBurnin) { muOverallBurnin[iter] = muOverall; sigmaBetweenBurnin[iter] = sigmaBetween; sigmaWithinBurnin[iter] = sigmaWithin; SaveWorkerChainData(iter, muWorker, workerBurnin); } } else if ((iter - NBurnin) % NThin == 0) { muOverallSample[savedIter] = muOverall; sigmaBetweenSample[savedIter] = sigmaBetween; sigmaWithinSample[savedIter] = sigmaWithin; SaveWorkerChainData(savedIter, muWorker, workerSample); savedIter++; } } //for ... } catch (Exception ex) { this.Result.Messages.AddError(WEException.GetStandardMessage(ex, iter, Result.PRNGSeed), this.ClassName); return; } }