Beispiel #1
0
        public SEGUninformativeModel(MeasureList measures, UninformativeModelParameters specificParams, McmcParameters mcmcParams = null)
            : base(measures, specificParams.LogNormalDstrn, /*new Range(specificParams.MuLower, specificParams.MuUpper, specificParams.InitMu),*/ mcmcParams)
        {
            this.MuLower = specificParams.MuLower;
            this.MuUpper = specificParams.MuUpper;
            this.SDRange = specificParams.SDRange;
            this.InitMu  = specificParams.InitMu;
            this.InitSD  = specificParams.InitSD;
            this.Result  = new ModelResult(this, "mu", "sd");
            bool testSD = double.IsNaN(this.InitSD) || (this.InitSD == 0);

            if (Tools.IsND(this.InitMu) || testSD)
            {
                InitialValues initVals = WebExpoFunctions3.DefaultInits(this.Data, this.OutcomeIsLogNormallyDistributed, Tools.Combine(this.MuLower, this.MuUpper), this.SDRange, includeCensoredData: false);
                if (Tools.IsND(this.InitMu))
                {
                    this.InitMu = initVals.Mu;
                }

                if (testSD)
                {
                    this.InitSD = initVals.SigmaWithin;
                }
            }

            if (this.ME.ThroughCV)
            {
                this.Result.Chains.Add("cv");
            }
        }// end constructor
Beispiel #2
0
        //Tools.Combine(-0.693147180559945, 0.797884560802865, -0.318309886183791, 0.0363356023574984); // logPhi.quadratic.approx.coeff

        internal static InitialValues DefaultInits(DataSummary data, bool logNormalDistrn, double[] muRange, double[] sigmaRange, bool includeCensoredData)
        {
            //# modif_0.13
            //# added argument include.censored.data to this fct
            double        mu;
            double        sigma;
            double        sigmaLower  = sigmaRange.Min();
            double        sigmaUpper  = sigmaRange.Max();
            List <double> normalizedY = new List <double>();

            if (data.YLength > 0)
            {
                normalizedY.AddRange(logNormalDistrn ? data.LogY : data.Y);
            }

            // new_0.12
            if (includeCensoredData)
            {
                if (data.GTLength > 0)
                {
                    normalizedY.AddRange(logNormalDistrn ? data.LogGT : data.GT);
                }

                if (data.LTLength > 0)
                {
                    normalizedY.AddRange(logNormalDistrn ? data.LogLT : data.LT);
                }

                if (data.IntervalLength > 0)
                {
                    double[] midPoints = new double[data.IntervalLength];
                    double[] lt        = logNormalDistrn ? data.LogIntervalLT : data.IntervalLT;
                    double[] gt        = logNormalDistrn ? data.LogIntervalGT : data.IntervalGT;
                    for (int i = 0; i < data.IntervalLength; i++)
                    {
                        midPoints[i] = gt[i] + (lt[i] - gt[i]) / 2.0;
                    }
                    normalizedY.AddRange(midPoints);
                }
            }

            if (data.YLength > 0)
            {
                mu = normalizedY.Mean();
                double lower = muRange.Min();

                if (mu < lower)
                {
                    mu = lower;
                }
                else
                {
                    double muUpper = muRange.Max();
                    if (mu > muUpper)
                    {
                        mu = muUpper;
                    }
                }

                if (normalizedY.Count > 1)
                {
                    sigma = Math.Sqrt(normalizedY.Variance());
                }
                else if (!includeCensoredData)
                {
                    InitialValues tmp = DefaultInits(data, logNormalDistrn, muRange, sigmaRange, includeCensoredData: true);
                    sigma = tmp.SigmaWithin;
                }
                else
                {
                    //# new_0.13
                    sigma = 0; //# will be corrected below
                }

                if (sigma < sigmaLower)
                {
                    sigma = sigmaLower;
                }

                // sigma >= 0 && sigma >= sigmaLower
                if (sigma == 0.0)
                {
                    // sigmaLower <= 0 !!
                    sigma = sigmaUpper / 10.0;
                }
            }
            else
            {
                sigma = sigmaLower > 0 ? sigmaLower : sigmaUpper / 10.0;
                mu    = Tools.Mean(muRange);
            }

            return(new InitialValues(mu, sigma));
        } // Default.inits
Beispiel #3
0
        internal InitialValues DefaultInits(DataSummary data, bool includeCensoredData)
        {
            double muOverall            = Tools.ND;
            double sigmaWithin          = Tools.ND;
            bool   logNormalDstrn       = this.LogNormalDstrn;
            bool   useUniformPriorOnSds = this.UseUniformPriorOnSds;


            List <double> workerMeans    = new List <double>();
            List <double> workerSds      = new List <double>();
            List <double> normalizedData = new List <double>();

            int[] MeasureCountByWorker = new int[data.NWorkers];
            Dictionary <int, List <double> > measureValueByWorker = new Dictionary <int, List <double> >();

            if (data.YLength > 0)
            {
                //Une liste pour chaque travailleurs. wo == workerOrdinal
                for (int wo = 0; wo < data.NWorkers; wo++)
                {
                    measureValueByWorker[wo] = new List <double>();
                }

                Measure[] lm;
                //On ajoute les mesures pour chacun des travailleurs
                lm = data.UncensoredMeasures;
                for (int i = 0; i < lm.Length; i++)
                {
                    int           wo    = lm[i].Worker.Ordinal;
                    List <double> lst   = measureValueByWorker[wo];
                    double        value = logNormalDstrn ? Math.Log(lm[i].A) : lm[i].A;
                    lst.Add(value);
                    normalizedData.Add(value);
                }
            }

            if (includeCensoredData)
            {
                Measure[] lm;
                lm = data.GTMeasures;
                for (int i = 0; i < lm.Length; i++)
                {
                    int           wo    = lm[i].Worker.Ordinal;
                    List <double> lst   = measureValueByWorker[wo];
                    double        value = logNormalDstrn ? Math.Log(lm[i].A) : lm[i].A;
                    lst.Add(value);
                    normalizedData.Add(value);
                }

                lm = data.LTMeasures;
                for (int i = 0; i < lm.Length; i++)
                {
                    int           wo    = lm[i].Worker.Ordinal;
                    List <double> lst   = measureValueByWorker[wo];
                    double        value = logNormalDstrn ? Math.Log(lm[i].A) : lm[i].A;
                    lst.Add(value);
                    normalizedData.Add(value);
                }

                lm = data.IntervalMeasures;
                for (int i = 0; i < lm.Length; i++)
                {
                    int           wo    = lm[i].Worker.Ordinal;
                    List <double> lst   = measureValueByWorker[wo];
                    double        midP  = lm[i].A + (lm[i].B - lm[i].A) / 2;
                    double        value = logNormalDstrn ? Math.Log(midP) : midP;
                    lst.Add(value);
                    normalizedData.Add(value);
                }
            }

            if (normalizedData.Count > 0)
            {
                for (int o = 0; o < data.NWorkers; o++)
                {
                    List <double> src = measureValueByWorker[o];
                    if (src.Count == 0)
                    {
                        continue;
                    }

                    if (src.Count == 1)
                    {
                        workerMeans.Add(src[0]);
                        continue; // pas de sd
                    }

                    int    n    = 0;
                    double mean = 0;
                    double M2   = 0;

                    foreach (double x in src)
                    {
                        n++;
                        double delta = x - mean;
                        mean += delta / n;
                        M2   += delta * (x - mean);
                    }

                    workerMeans.Add(mean);
                    if (n > 1)
                    {
                        workerSds.Add(Math.Sqrt(M2 / (n - 1)));
                    }
                }

                //means.Length > 0
                muOverall = workerMeans.Average();

                //# modif_0.13
                if (workerSds.Count == 0)
                {
                    if (workerMeans.Count > 1)
                    {
                        sigmaWithin = Math.Sqrt(workerMeans.Variance());
                    }
                }
                else
                {
                    sigmaWithin = workerSds.Mean();
                }
            }
            else
            {
                muOverall = 0.0;
                normalizedData.Clear();
            }

            // # new_0.13
            if (Tools.IsND(sigmaWithin) && !includeCensoredData)
            {
                //# call this fct again, but this time including censored data
                InitialValues tmp = DefaultInits(data, includeCensoredData: true);
                sigmaWithin = tmp.SigmaWithin;
            }

            // # new_0.13
            if (Tools.IsND(sigmaWithin))
            {
                sigmaWithin = GetSigmaWithin();
            }

            return(new InitialValues(muOverall, sigmaWithin, normalizedData));
        } //# end of Default.inits.local
Beispiel #4
0
        public BetweenWorkerModel(MeasureList measures, AbstractBWModelParameters specificParams, McmcParameters mcmcParams = null)
            : base(measures, specificParams.LogNormalDstrn, mcmcParams)
        {
            this.Result = new ModelResult(this, "muOverall", "sigmaWithin", "sigmaBetween");
            if (!measures.IsWorkerInfoComplete)
            {
                this.Messages.AddError("Incomplete worker information.", this.ClassName);
            }

            if (this.Data.MEAny)
            {
                if (this.Data.METhroughSD && !MeasurementErrorSupport.MESD)
                {
                    this.Messages.AddError("No support for METhrougSD.", this.ClassName);
                }
                else if (this.Data.METhroughCV && !MeasurementErrorSupport.me_CV)
                {
                    this.Messages.AddError("No support for METhrougCV.", this.ClassName);
                }
            }

            if (this.Messages.Level == Message.Severity.Error)
            {
                return;
            }

            this.UseUniformPriorOnSds = specificParams.UseUniformPriorOnSds;
            if (this.UseUniformPriorOnSds)
            {
                this.SigmaBetweenRange = Tools.Copy(((BWModelParameters_UniformPriorOnSDs)specificParams).SigmaBetweenRange);
                this.SigmaWithinRange  = ((BWModelParameters_UniformPriorOnSDs)specificParams).SigmaWithinRange;
            }
            else
            {
                this.LogSigmaBetweenMu   = ((BWModelParameters)specificParams).LogSigmaBetweenMu;
                this.LogSigmaBetweenPrec = ((BWModelParameters)specificParams).LogSigmaBetweenPrec;
                this.LogSigmaWithinMu    = ((BWModelParameters)specificParams).LogSigmaWithinMu;
                this.LogSigmaWithinPrec  = ((BWModelParameters)specificParams).LogSigmaWithinPrec;
            }

            //4 paramètres communs aux 2 formes que prend le modèle.
            this.MuOverallLower  = specificParams.MuOverallLower;
            this.MuOverallUpper  = specificParams.MuOverallUpper;
            this.InitMuOverall   = specificParams.InitMuOverall;
            this.InitSigmaWithin = specificParams.InitSigmaWithin;

            this.MuOverallRange = Tools.Combine(this.MuOverallLower, this.MuOverallUpper);
            this.Result.AddWorkerMuChains(Data.WorkersByTag.Values);

            if (!Data.AnyCensored && UseUniformPriorOnSds)
            {
                //
                //# If there is no variation observed within subjects,
                //# then we require a non-null lower bound for sigma.within
                //
                if (SigmaWithinRange[0] == 0)
                {
                    bool problem = (Data.NWorkers == Data.N); //il devrait donc y avoir plus d'une mesure pour au moins un travailleur
                    if (!problem)
                    {
                        problem = true;
                        foreach (KeyValuePair <Worker, List <Measure> > kv in Data.MeasuresByWorker)
                        {
                            if (kv.Value.Count <= 1)
                            {
                                continue;
                            }
                            //at least two measures
                            double vari = kv.Value.Select(x => x.A).Variance();
                            if (double.IsNaN(vari) || (vari == 0))
                            {
                                continue;
                            }
                            else
                            {
                                problem = false;
                                break;
                            }
                        } //foreach
                    }

                    if (problem)
                    {
                        this.Messages.AddError("Lower bound for SigmaWithinRange must be > 0 due to observed null within-subjects variance.", this.ClassName);
                        return;
                    }
                }
            }

            if (specificParams.GetType() == typeof(BWModelParameters))// && (Tools.IsND(this.InitMuOverall) || Tools.IsND(this.InitSigmaWithin)))
            {
                InitialValues initValues = specificParams.DefaultInits(this.Data, includeCensoredData: false);

                if (Tools.IsND(this.InitMuOverall))
                {
                    this.InitMuOverall = initValues.Mu;
                }

                if (Tools.IsND(this.InitSigmaWithin))
                {
                    this.InitSigmaWithin = initValues.SigmaWithin;
                }

                this.NormalizedY = initValues.NormalizedY.ToArray();
            }
        }