Exemple #1
0
void MainWindow::binom(){
    frmSettings *dlg = new frmSettings();

    QSettings settings(QSettings::IniFormat, QSettings::UserScope, "RJsoft", "ssconf");

    settings.beginGroup("CIprms");
    if(settings.contains("k")){
        dlg->m_ui->spinBox->setValue(settings.value("k").toInt());
    } else {
        dlg->m_ui->spinBox->setValue(0);
    }
    if(settings.contains("n")){
        dlg->m_ui->spinBox_2->setValue(settings.value("n").toInt());
    } else {
        dlg->m_ui->spinBox_2->setValue(0);
    }
    if(settings.contains("alpha")){
        dlg->m_ui->doubleSpinBox_3->setValue(settings.value("alpha").toDouble());
    } else {
        dlg->m_ui->doubleSpinBox_3->setValue(0.95);
    }
    if(settings.contains("Sp")){
        dlg->m_ui->doubleSpinBox_2->setValue(settings.value("Sp").toDouble());
    } else {
        dlg->m_ui->doubleSpinBox_2->setValue(1.0);
    }
    if(settings.contains("Se")){
        dlg->m_ui->doubleSpinBox->setValue(settings.value("Se").toDouble());
    } else {
        dlg->m_ui->doubleSpinBox->setValue(1.0);
    }
    if(settings.contains("method")){
        dlg->m_ui->comboBox->setCurrentIndex(dlg->m_ui->comboBox->findText(settings.value("method").toString(), Qt::MatchExactly));
    } else {
        dlg->m_ui->comboBox->setCurrentIndex(dlg->m_ui->comboBox->findText("Blaker", Qt::MatchExactly));
    }
    settings.endGroup();

    if (dlg->exec() == QDialog::Accepted ){

        QApplication::setOverrideCursor( Qt::WaitCursor );

        unsigned int k = dlg->m_ui->spinBox->value();
        unsigned int n = dlg->m_ui->spinBox_2->value();
        double conf    = dlg->m_ui->doubleSpinBox_3->value();
        double alpha   = 1-conf;
        double Se = dlg->m_ui->doubleSpinBox->value();
        double Sp = dlg->m_ui->doubleSpinBox_2->value();

        settings.beginGroup("CIprms");
        settings.setValue("k",     k);
        settings.setValue("n",     n);
        settings.setValue("alpha", dlg->m_ui->doubleSpinBox_3->value());
        settings.setValue("Sp",    Sp);
        settings.setValue("Se",    Se);
        settings.setValue("method",dlg->m_ui->comboBox->currentText());
        settings.endGroup();

        double pbal = 0, pjobb=1, sum=0;
        double prev = (double)k/(double)n;

        ui->plainTextEdit->appendPlainText(
            QString("Number of test positives:   %1  out of   %2\nSensitivity: %3     Specificity: %4     Confidence level: %5     Method: %6\n")
            .arg(k).arg(n).arg(Se).arg(Sp).arg(conf)
            .arg(dlg->m_ui->comboBox->currentText())
            );


        if (dlg->m_ui->comboBox->currentText()=="Sterne"){

        // ----------------------------------------------------------
        // -------------------- S T E R N E -------------------------
        // ----------------------------------------------------------

            //bal
            int z =0;
            for(double p=0.0001; p<=0.9999; p = p+0.0001){
                sum=0;
                double kp = gsl_ran_binomial_pdf(k, p, n);
                for(unsigned int x=0; x!=n+1; x++){
                    double xp = gsl_ran_binomial_pdf(x, p, n);
                    if (xp<=kp){
                        sum = sum+xp;
                    }
                }
                if (sum<alpha){
                    pbal = p;
    //                ui->plainTextEdit->appendPlainText(QString("sum: %1; p: %2").arg(sum).arg(p));
                } else {
                    break;
                }
                z++;
            }

            //jobb
            z =0;
            for(double p=0.9999; p>=0.0001; p = p-0.0001){
                sum=0;
                double kp = gsl_ran_binomial_pdf(k, p, n);
                for(unsigned int x=0; x!=n+1; x++){
                    double xp = gsl_ran_binomial_pdf(x, p, n);
                    if (xp<=kp){
                        sum = sum+xp;
                    }
                }
                if (sum<alpha){
                    pjobb = p;
                } else {
                    break;
                }
                z++;
            }

        } else if (dlg->m_ui->comboBox->currentText()=="Blaker"){

        // ----------------------------------------------------------
        // -------------------- B L A K E R -------------------------
        // ----------------------------------------------------------

            //bal
            int z =0;
            for(double p=0.0001; p<=0.9999; p = p+0.0001){
                sum=0;
                double kp = gsl_cdf_binomial_P(k, p, n);
                        // ui->plainTextEdit->appendPlainText(QString("k %1 p %2 n %3 kp %4\n").arg(k).arg(p).arg(n).arg(kp));
                double kp2 = gsl_cdf_binomial_Q(k, p, n) + gsl_ran_binomial_pdf(k, p, n);
                        // ui->plainTextEdit->appendPlainText(QString("k %1 p %2 n %3 kp2 %4\n").arg(k).arg(p).arg(n).arg(kp2));

                if (kp2 < kp) kp=kp2;
                for(unsigned int x=0; x!=n+1; x++){
                    double xp = gsl_cdf_binomial_P(x, p, n);
                           // ui->plainTextEdit->appendPlainText(QString("x %1 p %2 n %3 kp %4\n").arg(x).arg(p).arg(n).arg(xp));
                    double xp2 = gsl_cdf_binomial_Q(x, p, n) + gsl_ran_binomial_pdf(x, p, n);
                           // ui->plainTextEdit->appendPlainText(QString("x %1 p %2 n %3 kp2 %4\n").arg(x).arg(p).arg(n).arg(xp2));
                    if (xp2 < xp) xp=xp2;
                    double xxp = gsl_ran_binomial_pdf(x, p, n);
                            // ui->plainTextEdit->appendPlainText(QString("x %1 p %2 n %3 xxp %4\n").arg(x).arg(p).arg(n).arg(xxp));
                    if (xp<=kp){
                        sum = sum+xxp;
                    }
                            // ui->plainTextEdit->appendPlainText(QString("p %1 sum %2\n").arg(p).arg(sum));

                }
                if (sum<alpha){
                    pbal = p;
     //              ui->plainTextEdit->appendPlainText(QString("sum: %1; p: %2").arg(sum).arg(p));
                } else {
                    break;
                }
                z++;
            }

            //jobb
            z =0;
            for(double p=0.9999; p>=0.0001; p = p-0.0001){
                sum=0;
                double kp = gsl_cdf_binomial_P(k, p, n);
                double kp2 = gsl_cdf_binomial_Q(k, p, n) + gsl_ran_binomial_pdf(k, p, n);
                if (kp2 < kp) kp=kp2;
                for(unsigned int x=0; x!=n+1; x++){
                    double xp = gsl_cdf_binomial_P(x, p, n);
                    double xp2 = gsl_cdf_binomial_Q(x, p, n) + gsl_ran_binomial_pdf(x, p, n);
                    if (xp2 < xp) xp=xp2;
                    double xxp = gsl_ran_binomial_pdf(x, p, n);
                    if (xp<=kp){
                        sum = sum+xxp;
                    }
                }
                 // ui->plainTextEdit->appendPlainText(QString("p %1 sum %2\n").arg(p).arg(sum));
                if (sum<alpha){
                    pjobb = p;
                } else {
                    break;
                }
                z++;
            }
        } else if (dlg->m_ui->comboBox->currentText()=="Wilson"){

        // ----------------------------------------------------------
        // -------------------- W I L S O N -------------------------
        // ----------------------------------------------------------

            double zkrit = 1.96;
            double plusminus = zkrit * pow(pow(zkrit, 2.) + 4. * k * (n-k) / n, .5);
            double nevezo = 2.*(n + pow(zkrit, 2.));

            pbal = (2.*k + pow(zkrit, 2) - plusminus)/nevezo;
            pjobb = (2.*k + pow(zkrit, 2) + plusminus)/nevezo;

        } else if (dlg->m_ui->comboBox->currentText()=="Clopper-Pearson"){

        // ----------------------------------------------------------
        // ------------- C L O P P E R   P E A R S O N --------------
        // ----------------------------------------------------------

            //bal
            int z =0;
            for(double p=0.0001; p<=0.9999; p = p+0.0001){
                double kp = gsl_cdf_binomial_Q(k, p, n) + gsl_ran_binomial_pdf(k, p, n);
    //                ui->plainTextEdit->appendPlainText(QString("kp: %1; p: %2").arg(kp).arg(p));
                if (kp<0.5*alpha){
                    pbal = p;
              } else {
                    break;
                }
                z++;
            }

            //jobb
            z =0;
            for(double p=0.9999; p>=0.0001; p = p-0.0001){
                double kp = gsl_cdf_binomial_P(k, p, n);
                if (kp<0.5*alpha){
                    pjobb = p;
                } else {
                    break;
                }
                z++;
            }

        }

        kiir(pbal, pjobb, prev, Sp, Se);

        QApplication::restoreOverrideCursor();
    }    
}
Exemple #2
0
 double binomial_logicdf_gsl(unsigned k, double p, unsigned l)
 {
   return log(gsl_cdf_binomial_Q(k, p, l));
 }