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(); } }
double binomial_logicdf_gsl(unsigned k, double p, unsigned l) { return log(gsl_cdf_binomial_Q(k, p, l)); }