Example usage for org.apache.commons.math3.optim MaxEval MaxEval

List of usage examples for org.apache.commons.math3.optim MaxEval MaxEval

Introduction

In this page you can find the example usage for org.apache.commons.math3.optim MaxEval MaxEval.

Prototype

public MaxEval(int max) 

Source Link

Usage

From source file:com.itemanalysis.psychometrics.irt.equating.StockingLordMethodTest.java

/**
 * Item parameter and "true" linking coefficients are based on example 2 in Kolen's STUIRT program.
 * For polytomous items, the difficulty and threshold parameters were combined to be step parameters
 * as done with Brad Hanson's GPCM. That is, teh parameters are configured to conform to the "IS"
 * version of the GPCM as specified in the STUIRT manual.
 *///from  w  w w. ja v a2s  .co m
@Test
public void stockingLordTestMixedICL() {
    System.out.println("StockingLordMethod Test 4: STUIRT example 2 with ICL parameters");
    LinkedHashMap<String, ItemResponseModel> irmX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> irmY = new LinkedHashMap<String, ItemResponseModel>();

    //Form X
    irmX.put("v1", new Irm3PL(0.751335, -0.897391, 0.244001, 1.7));
    irmX.put("v2", new Irm3PL(0.955947, -0.811477, 0.242883, 1.7));
    irmX.put("v3", new Irm3PL(0.497206, -0.858681, 0.260893, 1.7));
    irmX.put("v4", new Irm3PL(0.724000, -0.123911, 0.243497, 1.7));
    irmX.put("v5", new Irm3PL(0.865200, 0.205889, 0.319135, 1.7));
    irmX.put("v6", new Irm3PL(0.658129, 0.555228, 0.277826, 1.7));
    irmX.put("v7", new Irm3PL(1.082118, 0.950549, 0.157979, 1.7));
    irmX.put("v8", new Irm3PL(0.988294, 1.377501, 0.084828, 1.7));
    irmX.put("v9", new Irm3PL(1.248923, 1.614355, 0.181874, 1.7));
    irmX.put("v10", new Irm3PL(1.116682, 2.353932, 0.246856, 1.7));
    irmX.put("v11", new Irm3PL(0.438171, 3.217965, 0.309243, 1.7));
    irmX.put("v12", new Irm3PL(1.082206, 4.441864, 0.192339, 1.7));

    double[] step1 = { 0.0, 1.101266, -1.09327 };
    irmX.put("v13", new IrmGPCM(0.269994, step1, 1.7));

    double[] step2 = { 0.0, 1.739176, 1.526148 };
    irmX.put("v14", new IrmGPCM(0.972506, step2, 1.7));

    double[] step3 = { 0.0, 5.566958, 1.362356 };
    irmX.put("v15", new IrmGPCM(0.378812, step3, 1.7));

    double[] step4 = { 0.0, 0.533540, 2.091335, 0.405283 };
    irmX.put("v16", new IrmGPCM(0.537706, step4, 1.7));

    double[] step5 = { 0.0, 3.440463, 2.235171, 1.62318 };
    irmX.put("v17", new IrmGPCM(0.554506, step5, 1.7));

    //Form Y
    irmY.put("v1", new Irm3PL(0.887276, -1.334798, 0.134406, 1.7));
    irmY.put("v2", new Irm3PL(1.184412, -1.129004, 0.237765, 1.7));
    irmY.put("v3", new Irm3PL(0.609412, -1.464546, 0.151393, 1.7));
    irmY.put("v4", new Irm3PL(0.923812, -0.576435, 0.240097, 1.7));
    irmY.put("v5", new Irm3PL(0.822776, -0.476357, 0.192369, 1.7));
    irmY.put("v6", new Irm3PL(0.707818, -0.235189, 0.189557, 1.7));
    irmY.put("v7", new Irm3PL(1.306976, 0.242986, 0.165553, 1.7));
    irmY.put("v8", new Irm3PL(1.295471, 0.598029, 0.090557, 1.7));
    irmY.put("v9", new Irm3PL(1.366841, 0.923206, 0.172993, 1.7));
    irmY.put("v10", new Irm3PL(1.389624, 1.380666, 0.238008, 1.7));
    irmY.put("v11", new Irm3PL(0.293806, 2.028070, 0.203448, 1.7));
    irmY.put("v12", new Irm3PL(0.885347, 3.152928, 0.195473, 1.7));

    double[] step1Y = { 0.0, 0.399117, -1.38735 };
    irmY.put("v13", new IrmGPCM(0.346324, step1Y, 1.7));

    double[] step2Y = { 0.0, 0.956014, 0.756514 };
    irmY.put("v14", new IrmGPCM(1.252012, step2Y, 1.7));

    double[] step3Y = { 0.0, 4.676299, 0.975303 };
    irmY.put("v15", new IrmGPCM(0.392282, step3Y, 1.7));

    double[] step4Y = { 0.0, 0.042549, 1.104823, -0.118440 };
    irmY.put("v16", new IrmGPCM(0.660841, step4Y, 1.7));

    double[] step5Y = { 0.0, 2.645241, 1.536046, 0.748514 };
    irmY.put("v17", new IrmGPCM(0.669612, step5Y, 1.7));

    UniformDistributionApproximation uniform = new UniformDistributionApproximation(-3.0, 3.0, 25);

    StockingLordMethod sl = new StockingLordMethod(irmX, irmY, uniform, uniform, EquatingCriterionType.Q1Q2);
    sl.setPrecision(6);
    double[] startValues = { 0, 1 };

    //Run test with UNCMIN optimizer
    DefaultUncminOptimizer optimizer = new DefaultUncminOptimizer();
    double[] param1 = null;
    double[] param2 = null;
    double f = 0;

    try {
        optimizer.minimize(sl, startValues);
        param1 = optimizer.getParameters();
        f = optimizer.getFunctionValue();
        sl.setIntercept(param1[0]);
        sl.setScale(param1[1]);

    } catch (UncminException ex) {
        ex.printStackTrace();
    }

    //Check UNCMIN values against results from STUIRT.
    System.out.println("  UNCMIN Optimization");
    System.out.println("  Iterations: ");
    System.out.println("  fmin: " + f);
    System.out.println("  B = " + sl.getIntercept() + "  A = " + sl.getScale());

    assertEquals("  Intercept test", -0.452240, sl.getIntercept(), 1e-6);
    assertEquals("  Scale test", 0.820927, sl.getScale(), 1e-6);

    //Check BOBYQA values against STUIRT results.
    int numIterpolationPoints = 2 * 2;//two dimensions A and B
    BOBYQAOptimizer underlying = new BOBYQAOptimizer(numIterpolationPoints);
    RandomGenerator g = new JDKRandomGenerator();
    RandomVectorGenerator generator = new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
    MultiStartMultivariateOptimizer optimizer2 = new MultiStartMultivariateOptimizer(underlying, 10, generator);
    PointValuePair optimum = optimizer2.optimize(new MaxEval(1000), new ObjectiveFunction(sl),
            GoalType.MINIMIZE, SimpleBounds.unbounded(2), new InitialGuess(startValues));

    param2 = optimum.getPoint();
    sl.setIntercept(param2[0]);
    sl.setScale(param2[1]);

    System.out.println();
    System.out.println("  BOBYQA Optimization");
    System.out.println("  Iterations: " + optimizer2.getEvaluations());
    System.out.println("  fmin: " + optimum.getValue());
    System.out.println("  B = " + param2[0] + "  A = " + param2[1]);

    assertEquals("  Intercept test", -0.452240, sl.getIntercept(), 1e-6);
    assertEquals("  Scale test", 0.820927, sl.getScale(), 1e-6);

    //Compare results from each optimizer
    assertEquals("  Intercept test", param1[0], param2[0], 1e-6);
    assertEquals("  Scale test", param1[1], param2[1], 1e-6);

}

From source file:gdsc.smlm.ij.plugins.pcpalm.PCPALMMolecules.java

private double[] optimiseLeastSquares(float[] x, float[] y, double[] initialSolution) {
    // Least-squares optimisation using numerical gradients
    final SkewNormalDifferentiableFunction myFunction = new SkewNormalDifferentiableFunction(initialSolution);
    myFunction.addData(x, y);//ww w .ja v a  2  s  .c  o  m
    LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();

    PointVectorValuePair optimum = optimizer.optimize(new MaxIter(3000), new MaxEval(Integer.MAX_VALUE),
            new ModelFunctionJacobian(new MultivariateMatrixFunction() {
                public double[][] value(double[] point) throws IllegalArgumentException {
                    return myFunction.jacobian(point);
                }
            }), new ModelFunction(myFunction), new Target(myFunction.calculateTarget()),
            new Weight(myFunction.calculateWeights()), new InitialGuess(initialSolution));

    double[] skewParameters = optimum.getPoint();
    return skewParameters;
}

From source file:gdsc.smlm.ij.plugins.pcpalm.PCPALMMolecules.java

private double[] optimiseSimplex(float[] x, float[] y, double[] initialSolution) {
    // Simplex optimisation
    SkewNormalMultivariateFunction sn2 = new SkewNormalMultivariateFunction(initialSolution);
    sn2.addData(x, y);/*from  w w w  .  j a  v a  2s  .  c  o  m*/
    NelderMeadSimplex simplex = new NelderMeadSimplex(4);
    SimplexOptimizer opt = new SimplexOptimizer(1e-6, 1e-10);
    PointValuePair solution = opt.optimize(new MaxEval(1000), new InitialGuess(initialSolution), simplex,
            new ObjectiveFunction(sn2), GoalType.MINIMIZE);

    double[] skewParameters2 = solution.getPointRef();
    return skewParameters2;
}

From source file:com.itemanalysis.psychometrics.irt.equating.HaebaraMethodTest.java

@Test
public void stockingLordTestMixedFormat4() {
    System.out.println("StockingLordMethod Test 5: Mixed format test, symmetric, Graded Response 2");
    LinkedHashMap<String, ItemResponseModel> irmX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> irmY = new LinkedHashMap<String, ItemResponseModel>();

    //3pl items/*from   w  w w. j a  v  a2  s .c  o m*/
    irmX.put("v1", new Irm3PL(1.0755, -1.8758, 0.1240, 1.7));
    irmX.put("v2", new Irm3PL(0.6428, -0.9211, 0.1361, 1.7));
    irmX.put("v3", new Irm3PL(0.6198, -1.3362, 0.1276, 1.7));
    irmX.put("v4", new Irm3PL(0.6835, -1.8967, 0.1619, 1.7));
    irmX.put("v5", new Irm3PL(0.9892, -0.6427, 0.2050, 1.7));
    irmX.put("v6", new Irm3PL(0.5784, -0.8181, 0.1168, 1.7));
    irmX.put("v7", new Irm3PL(0.9822, -0.9897, 0.1053, 1.7));
    irmX.put("v8", new Irm3PL(1.6026, -1.2382, 0.1202, 1.7));
    irmX.put("v9", new Irm3PL(0.8988, -0.5180, 0.1320, 1.7));
    irmX.put("v10", new Irm3PL(1.2525, -0.7164, 0.1493, 1.7));

    //gpcm items
    double[] step1 = { -2.1415, 0.0382, 0.6551 };
    irmX.put("v11", new IrmGRM(1.1196, step1, 1.7));

    double[] step2 = { -1.7523, -1.0660, 0.3533 };
    irmX.put("v12", new IrmGRM(1.2290, step2, 1.7));

    double[] step3 = { -2.3126, -1.8816, 0.7757 };
    irmX.put("v13", new IrmGRM(0.6405, step3, 1.7));

    double[] step4 = { -1.9728, -0.2810, 1.1387 };
    irmX.put("v14", new IrmGRM(1.1622, step4, 1.7));

    double[] step5 = { -2.2207, -0.8252, 0.9702 };
    irmX.put("v15", new IrmGRM(1.2249, step5, 1.7));

    //3pl items
    irmY.put("v1", new Irm3PL(0.7444, -1.5617, 0.1609, 1.7));
    irmY.put("v2", new Irm3PL(0.5562, -0.1031, 0.1753, 1.7));
    irmY.put("v3", new Irm3PL(0.5262, -1.0676, 0.1602, 1.7));
    irmY.put("v4", new Irm3PL(0.6388, -1.3880, 0.1676, 1.7));
    irmY.put("v5", new Irm3PL(0.8793, -0.2051, 0.1422, 1.7));
    irmY.put("v6", new Irm3PL(0.4105, 0.0555, 0.2120, 1.7));
    irmY.put("v7", new Irm3PL(0.7686, -0.3800, 0.2090, 1.7));
    irmY.put("v8", new Irm3PL(1.0539, -0.7570, 0.1270, 1.7));
    irmY.put("v9", new Irm3PL(0.7400, 0.0667, 0.1543, 1.7));
    irmY.put("v10", new Irm3PL(0.7479, 0.0281, 0.1489, 1.7));

    //gpcm items
    double[] step6 = { -1.7786, 0.7177, 1.45011 };
    irmY.put("v11", new IrmGRM(0.9171, step6, 1.7));

    double[] step7 = { -1.4115, -0.4946, 1.15969 };
    irmY.put("v12", new IrmGRM(0.9751, step7, 1.7));

    double[] step8 = { -1.8478, -1.4078, 1.51339 };
    irmY.put("v13", new IrmGRM(0.5890, step8, 1.7));

    double[] step9 = { -1.6151, 0.3002, 2.04728 };
    irmY.put("v14", new IrmGRM(0.9804, step9, 1.7));

    double[] step10 = { -1.9355, -0.2267, 1.88991 };
    irmY.put("v15", new IrmGRM(1.0117, step10, 1.7));

    UserSuppliedDistributionApproximation distX = new UserSuppliedDistributionApproximation(points, xDensity);
    UserSuppliedDistributionApproximation distY = new UserSuppliedDistributionApproximation(points, yDensity);

    HaebaraMethod hb = new HaebaraMethod(irmX, irmY, distX, distY, EquatingCriterionType.Q1Q2);
    hb.setPrecision(4);
    double[] startValues = { 0, 1 };

    int numIterpolationPoints = 2 * 2;//two dimensions A and B
    BOBYQAOptimizer underlying = new BOBYQAOptimizer(numIterpolationPoints);
    RandomGenerator g = new JDKRandomGenerator();
    RandomVectorGenerator generator = new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
    MultiStartMultivariateOptimizer optimizer = new MultiStartMultivariateOptimizer(underlying, 10, generator);
    org.apache.commons.math3.optim.PointValuePair optimum = optimizer.optimize(new MaxEval(1000),
            new ObjectiveFunction(hb), org.apache.commons.math3.optim.nonlinear.scalar.GoalType.MINIMIZE,
            SimpleBounds.unbounded(2), new InitialGuess(startValues));

    double[] hbCoefficients = optimum.getPoint();
    hb.setIntercept(hbCoefficients[0]);
    hb.setScale(hbCoefficients[1]);

    System.out.println("  Iterations: " + optimizer.getEvaluations());
    System.out.println("  fmin: " + optimum.getValue());
    System.out.println("  B = " + hbCoefficients[0] + "  A = " + hbCoefficients[1]);

    assertEquals("  Intercept test", 0.726026, hb.getIntercept(), 1e-4);
    assertEquals("  Scale test", 1.203780, hb.getScale(), 1e-4);

    System.out.println();

}

From source file:com.itemanalysis.psychometrics.irt.equating.StockingLordMethodTest.java

@Test
public void stockingLordTestMixedFormatGradedResponse() {
    System.out.println("StockingLordMethod Test 5: Mixed format test, symmetric, Graded Response");
    LinkedHashMap<String, ItemResponseModel> irmX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> irmY = new LinkedHashMap<String, ItemResponseModel>();

    //3pl items/*  w ww .ja v a2s .c o  m*/
    irmX.put("v1", new Irm3PL(1.0755, -1.8758, 0.1240, 1.7));
    irmX.put("v2", new Irm3PL(0.6428, -0.9211, 0.1361, 1.7));
    irmX.put("v3", new Irm3PL(0.6198, -1.3362, 0.1276, 1.7));
    irmX.put("v4", new Irm3PL(0.6835, -1.8967, 0.1619, 1.7));
    irmX.put("v5", new Irm3PL(0.9892, -0.6427, 0.2050, 1.7));
    irmX.put("v6", new Irm3PL(0.5784, -0.8181, 0.1168, 1.7));
    irmX.put("v7", new Irm3PL(0.9822, -0.9897, 0.1053, 1.7));
    irmX.put("v8", new Irm3PL(1.6026, -1.2382, 0.1202, 1.7));
    irmX.put("v9", new Irm3PL(0.8988, -0.5180, 0.1320, 1.7));
    irmX.put("v10", new Irm3PL(1.2525, -0.7164, 0.1493, 1.7));

    //gpcm items
    double[] step1 = { -2.1415, 0.0382, 0.6551 };
    irmX.put("v11", new IrmGRM(1.1196, step1, 1.7));

    double[] step2 = { -1.7523, -1.0660, 0.3533 };
    irmX.put("v12", new IrmGRM(1.2290, step2, 1.7));

    double[] step3 = { -2.3126, -1.8816, 0.7757 };
    irmX.put("v13", new IrmGRM(0.6405, step3, 1.7));

    double[] step4 = { -1.9728, -0.2810, 1.1387 };
    irmX.put("v14", new IrmGRM(1.1622, step4, 1.7));

    double[] step5 = { -2.2207, -0.8252, 0.9702 };
    irmX.put("v15", new IrmGRM(1.2249, step5, 1.7));

    //3pl items
    irmY.put("v1", new Irm3PL(0.7444, -1.5617, 0.1609, 1.7));
    irmY.put("v2", new Irm3PL(0.5562, -0.1031, 0.1753, 1.7));
    irmY.put("v3", new Irm3PL(0.5262, -1.0676, 0.1602, 1.7));
    irmY.put("v4", new Irm3PL(0.6388, -1.3880, 0.1676, 1.7));
    irmY.put("v5", new Irm3PL(0.8793, -0.2051, 0.1422, 1.7));
    irmY.put("v6", new Irm3PL(0.4105, 0.0555, 0.2120, 1.7));
    irmY.put("v7", new Irm3PL(0.7686, -0.3800, 0.2090, 1.7));
    irmY.put("v8", new Irm3PL(1.0539, -0.7570, 0.1270, 1.7));
    irmY.put("v9", new Irm3PL(0.7400, 0.0667, 0.1543, 1.7));
    irmY.put("v10", new Irm3PL(0.7479, 0.0281, 0.1489, 1.7));

    //gpcm items
    double[] step6 = { -1.7786, 0.7177, 1.45011 };
    irmY.put("v11", new IrmGRM(0.9171, step6, 1.7));

    double[] step7 = { -1.4115, -0.4946, 1.15969 };
    irmY.put("v12", new IrmGRM(0.9751, step7, 1.7));

    double[] step8 = { -1.8478, -1.4078, 1.51339 };
    irmY.put("v13", new IrmGRM(0.5890, step8, 1.7));

    double[] step9 = { -1.6151, 0.3002, 2.04728 };
    irmY.put("v14", new IrmGRM(0.9804, step9, 1.7));

    double[] step10 = { -1.9355, -0.2267, 1.88991 };
    irmY.put("v15", new IrmGRM(1.0117, step10, 1.7));

    UniformDistributionApproximation uniform = new UniformDistributionApproximation(-3.0, 3.0, 25);

    StockingLordMethod sl = new StockingLordMethod(irmX, irmY, uniform, uniform, EquatingCriterionType.Q1Q2);
    sl.setPrecision(4);
    double[] startValues = { 0, 1 };

    int numIterpolationPoints = 2 * 2;//two dimensions A and B
    BOBYQAOptimizer underlying = new BOBYQAOptimizer(numIterpolationPoints);
    RandomGenerator g = new JDKRandomGenerator();
    RandomVectorGenerator generator = new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
    MultiStartMultivariateOptimizer optimizer = new MultiStartMultivariateOptimizer(underlying, 10, generator);
    PointValuePair optimum = optimizer.optimize(new MaxEval(1000), new ObjectiveFunction(sl), GoalType.MINIMIZE,
            SimpleBounds.unbounded(2), new InitialGuess(startValues));

    double[] slCoefficients = optimum.getPoint();
    sl.setIntercept(slCoefficients[0]);
    sl.setScale(slCoefficients[1]);

    System.out.println("  Iterations: " + optimizer.getEvaluations());
    System.out.println("  fmin: " + optimum.getValue());
    System.out.println("  B = " + slCoefficients[0] + "  A = " + slCoefficients[1]);

    assertEquals("  Intercept test", 0.730924, sl.getIntercept(), 1e-4);
    assertEquals("  Scale test", 1.218034, sl.getScale(), 1e-4);

    System.out.println();

}

From source file:gdsc.smlm.ij.plugins.pcpalm.PCPALMFitting.java

/**
 * Fits the correlation curve with r>0 to the random model using the estimated density and precision. Parameters
 * must be fit within a tolerance of the starting values.
 * //  w ww .j  a  v a2 s  .  c o m
 * @param gr
 * @param sigmaS
 *            The estimated precision
 * @param proteinDensity
 *            The estimate protein density
 * @return The fitted parameters [precision, density]
 */
private double[] fitRandomModel(double[][] gr, double sigmaS, double proteinDensity, String resultColour) {
    final RandomModelFunction myFunction = new RandomModelFunction();
    randomModel = myFunction;

    log("Fitting %s: Estimated precision = %f nm, estimated protein density = %g um^-2", randomModel.getName(),
            sigmaS, proteinDensity * 1e6);

    randomModel.setLogging(true);

    for (int i = offset; i < gr[0].length; i++) {
        // Only fit the curve above the estimated resolution (points below it will be subject to error)
        if (gr[0][i] > sigmaS * fitAboveEstimatedPrecision)
            randomModel.addPoint(gr[0][i], gr[1][i]);
    }
    LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();

    PointVectorValuePair optimum;
    try {
        optimum = optimizer.optimize(new MaxIter(3000), new MaxEval(Integer.MAX_VALUE),
                new ModelFunctionJacobian(new MultivariateMatrixFunction() {
                    public double[][] value(double[] point) throws IllegalArgumentException {
                        return myFunction.jacobian(point);
                    }
                }), new ModelFunction(myFunction), new Target(myFunction.getY()),
                new Weight(myFunction.getWeights()), new InitialGuess(new double[] { sigmaS, proteinDensity }));
    } catch (TooManyIterationsException e) {
        log("Failed to fit %s: Too many iterations (%d)", randomModel.getName(), optimizer.getIterations());
        return null;
    } catch (ConvergenceException e) {
        log("Failed to fit %s: %s", randomModel.getName(), e.getMessage());
        return null;
    }

    randomModel.setLogging(false);

    double[] parameters = optimum.getPoint();
    // Ensure the width is positive
    parameters[0] = Math.abs(parameters[0]);

    double ss = 0;
    double[] obs = randomModel.getY();
    double[] exp = optimum.getValue();
    for (int i = 0; i < obs.length; i++)
        ss += (obs[i] - exp[i]) * (obs[i] - exp[i]);
    ic1 = Maths.getInformationCriterion(ss, randomModel.size(), parameters.length);

    final double fitSigmaS = parameters[0];
    final double fitProteinDensity = parameters[1];

    // Check the fitted parameters are within tolerance of the initial estimates
    double e1 = parameterDrift(sigmaS, fitSigmaS);
    double e2 = parameterDrift(proteinDensity, fitProteinDensity);

    log("  %s fit: SS = %f. cAIC = %f. %d evaluations", randomModel.getName(), ss, ic1,
            optimizer.getEvaluations());
    log("  %s parameters:", randomModel.getName());
    log("    Average precision = %s nm (%s%%)", Utils.rounded(fitSigmaS, 4), Utils.rounded(e1, 4));
    log("    Average protein density = %s um^-2 (%s%%)", Utils.rounded(fitProteinDensity * 1e6, 4),
            Utils.rounded(e2, 4));

    valid1 = true;
    if (fittingTolerance > 0 && (Math.abs(e1) > fittingTolerance || Math.abs(e2) > fittingTolerance)) {
        log("  Failed to fit %s within tolerance (%s%%): Average precision = %f nm (%s%%), average protein density = %g um^-2 (%s%%)",
                randomModel.getName(), Utils.rounded(fittingTolerance, 4), fitSigmaS, Utils.rounded(e1, 4),
                fitProteinDensity * 1e6, Utils.rounded(e2, 4));
        valid1 = false;
    }

    if (valid1) {
        // ---------
        // TODO - My data does not comply with this criteria. 
        // This could be due to the PC-PALM Molecule code limiting the nmPerPixel to fit the images in memory 
        // thus removing correlations at small r.
        // It could also be due to the nature of the random simulations being 3D not 2D membranes 
        // as per the PC-PALM paper. 
        // ---------
        // Evaluate g(r)protein where:
        // g(r)peaks = g(r)protein + g(r)stoch
        // g(r)peaks ~ 1           + g(r)stoch
        // Verify g(r)protein should be <1.5 for all r>0
        double[] gr_stoch = randomModel.value(parameters);
        double[] gr_peaks = randomModel.getY();
        double[] gr_ = randomModel.getX();

        //SummaryStatistics stats = new SummaryStatistics();
        for (int i = 0; i < gr_peaks.length; i++) {
            // Only evaluate above the fitted average precision 
            if (gr_[i] < fitSigmaS)
                continue;

            // Note the RandomModelFunction evaluates g(r)stoch + 1;
            double gr_protein_i = gr_peaks[i] - (gr_stoch[i] - 1);

            if (gr_protein_i > gr_protein_threshold) {
                // Failed fit
                log("  Failed to fit %s: g(r)protein %s > %s @ r=%s", randomModel.getName(),
                        Utils.rounded(gr_protein_i, 4), Utils.rounded(gr_protein_threshold, 4),
                        Utils.rounded(gr_[i], 4));
                valid1 = false;
            }
            //stats.addValue(gr_i);
            //System.out.printf("g(r)protein @ %f = %f\n", gr[0][i], gr_protein_i);
        }
    }

    addResult(randomModel.getName(), resultColour, valid1, fitSigmaS, fitProteinDensity, 0, 0, 0, 0, ic1);

    return parameters;
}

From source file:edu.cmu.tetrad.search.BinaryTetradTest.java

private void estimateTwoFactorModel(double params[]) {
    double bestScore = Double.MAX_VALUE;
    double bestParams[] = new double[params.length];
    for (int i = 0; i < 5; i++) {
        for (int c = 0; c < 11; c++) {
            params[c] = RandomUtil.getInstance().nextDouble() / 2. + 0.2;
        }/*from   w w w .j av a2 s  .c om*/

        MultivariateOptimizer search = new PowellOptimizer(1e-7, 1e-7);

        PointValuePair pair = search.optimize(new InitialGuess(params),
                new ObjectiveFunction(new FittingFunction(this)), GoalType.MINIMIZE, new MaxEval(100000));

        double newScore = scoreParams(pair.getPoint());

        if (newScore < bestScore) {
            System.arraycopy(params, 0, bestParams, 0, params.length);
            bestScore = newScore;
        }
        //System.out.println(scoreParams(params));
        //for (int c = 0; c < 11; c++)
        //    System.out.println(params[c]); System.exit(0);
    }
    System.arraycopy(bestParams, 0, params, 0, params.length);
    //System.out.println();
}

From source file:com.itemanalysis.psychometrics.irt.equating.HaebaraMethodTest.java

@Test
public void stockingLordTestMixedFormat5() {
    System.out.println("StockingLordMethod Test 6: Mixed format test, backwards, Graded Response 2");
    LinkedHashMap<String, ItemResponseModel> irmX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> irmY = new LinkedHashMap<String, ItemResponseModel>();

    //3pl items/*from  w  ww .  ja v  a 2  s.  c om*/
    irmX.put("v1", new Irm3PL(1.0755, -1.8758, 0.1240, 1.7));
    irmX.put("v2", new Irm3PL(0.6428, -0.9211, 0.1361, 1.7));
    irmX.put("v3", new Irm3PL(0.6198, -1.3362, 0.1276, 1.7));
    irmX.put("v4", new Irm3PL(0.6835, -1.8967, 0.1619, 1.7));
    irmX.put("v5", new Irm3PL(0.9892, -0.6427, 0.2050, 1.7));
    irmX.put("v6", new Irm3PL(0.5784, -0.8181, 0.1168, 1.7));
    irmX.put("v7", new Irm3PL(0.9822, -0.9897, 0.1053, 1.7));
    irmX.put("v8", new Irm3PL(1.6026, -1.2382, 0.1202, 1.7));
    irmX.put("v9", new Irm3PL(0.8988, -0.5180, 0.1320, 1.7));
    irmX.put("v10", new Irm3PL(1.2525, -0.7164, 0.1493, 1.7));

    //gpcm items
    double[] step1 = { -2.1415, 0.0382, 0.6551 };
    irmX.put("v11", new IrmGRM(1.1196, step1, 1.7));

    double[] step2 = { -1.7523, -1.0660, 0.3533 };
    irmX.put("v12", new IrmGRM(1.2290, step2, 1.7));

    double[] step3 = { -2.3126, -1.8816, 0.7757 };
    irmX.put("v13", new IrmGRM(0.6405, step3, 1.7));

    double[] step4 = { -1.9728, -0.2810, 1.1387 };
    irmX.put("v14", new IrmGRM(1.1622, step4, 1.7));

    double[] step5 = { -2.2207, -0.8252, 0.9702 };
    irmX.put("v15", new IrmGRM(1.2249, step5, 1.7));

    //3pl items
    irmY.put("v1", new Irm3PL(0.7444, -1.5617, 0.1609, 1.7));
    irmY.put("v2", new Irm3PL(0.5562, -0.1031, 0.1753, 1.7));
    irmY.put("v3", new Irm3PL(0.5262, -1.0676, 0.1602, 1.7));
    irmY.put("v4", new Irm3PL(0.6388, -1.3880, 0.1676, 1.7));
    irmY.put("v5", new Irm3PL(0.8793, -0.2051, 0.1422, 1.7));
    irmY.put("v6", new Irm3PL(0.4105, 0.0555, 0.2120, 1.7));
    irmY.put("v7", new Irm3PL(0.7686, -0.3800, 0.2090, 1.7));
    irmY.put("v8", new Irm3PL(1.0539, -0.7570, 0.1270, 1.7));
    irmY.put("v9", new Irm3PL(0.7400, 0.0667, 0.1543, 1.7));
    irmY.put("v10", new Irm3PL(0.7479, 0.0281, 0.1489, 1.7));

    //gpcm items
    double[] step6 = { -1.7786, 0.7177, 1.45011 };
    irmY.put("v11", new IrmGRM(0.9171, step6, 1.7));

    double[] step7 = { -1.4115, -0.4946, 1.15969 };
    irmY.put("v12", new IrmGRM(0.9751, step7, 1.7));

    double[] step8 = { -1.8478, -1.4078, 1.51339 };
    irmY.put("v13", new IrmGRM(0.5890, step8, 1.7));

    double[] step9 = { -1.6151, 0.3002, 2.04728 };
    irmY.put("v14", new IrmGRM(0.9804, step9, 1.7));

    double[] step10 = { -1.9355, -0.2267, 1.88991 };
    irmY.put("v15", new IrmGRM(1.0117, step10, 1.7));

    UserSuppliedDistributionApproximation distX = new UserSuppliedDistributionApproximation(points, xDensity);
    UserSuppliedDistributionApproximation distY = new UserSuppliedDistributionApproximation(points, yDensity);

    HaebaraMethod hb = new HaebaraMethod(irmX, irmY, distX, distY, EquatingCriterionType.Q1);
    hb.setPrecision(4);
    double[] startValues = { 0, 1 };

    int numIterpolationPoints = 2 * 2;//two dimensions A and B
    BOBYQAOptimizer underlying = new BOBYQAOptimizer(numIterpolationPoints);
    RandomGenerator g = new JDKRandomGenerator();
    RandomVectorGenerator generator = new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
    MultiStartMultivariateOptimizer optimizer = new MultiStartMultivariateOptimizer(underlying, 10, generator);
    org.apache.commons.math3.optim.PointValuePair optimum = optimizer.optimize(new MaxEval(1000),
            new ObjectiveFunction(hb), org.apache.commons.math3.optim.nonlinear.scalar.GoalType.MINIMIZE,
            SimpleBounds.unbounded(2), new InitialGuess(startValues));

    double[] hbCoefficients = optimum.getPoint();
    hb.setIntercept(hbCoefficients[0]);
    hb.setScale(hbCoefficients[1]);

    System.out.println("  Iterations: " + optimizer.getEvaluations());
    System.out.println("  fmin: " + optimum.getValue());
    System.out.println("  B = " + hbCoefficients[0] + "  A = " + hbCoefficients[1]);

    assertEquals("  Intercept test", 0.731176, hb.getIntercept(), 1e-4);
    assertEquals("  Scale test", 1.209901, hb.getScale(), 1e-4);

    System.out.println();

}

From source file:com.itemanalysis.psychometrics.irt.equating.StockingLordMethodTest.java

@Test
public void stockingLordTestMixedFormatGradedResponse2() {
    System.out.println("StockingLordMethod Test 5: Mixed format test, symmetric, Graded Response 2");
    LinkedHashMap<String, ItemResponseModel> irmX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> irmY = new LinkedHashMap<String, ItemResponseModel>();

    //3pl items//from   w ww  .j  ava2  s .co  m
    irmX.put("v1", new Irm3PL(1.0755, -1.8758, 0.1240, 1.7));
    irmX.put("v2", new Irm3PL(0.6428, -0.9211, 0.1361, 1.7));
    irmX.put("v3", new Irm3PL(0.6198, -1.3362, 0.1276, 1.7));
    irmX.put("v4", new Irm3PL(0.6835, -1.8967, 0.1619, 1.7));
    irmX.put("v5", new Irm3PL(0.9892, -0.6427, 0.2050, 1.7));
    irmX.put("v6", new Irm3PL(0.5784, -0.8181, 0.1168, 1.7));
    irmX.put("v7", new Irm3PL(0.9822, -0.9897, 0.1053, 1.7));
    irmX.put("v8", new Irm3PL(1.6026, -1.2382, 0.1202, 1.7));
    irmX.put("v9", new Irm3PL(0.8988, -0.5180, 0.1320, 1.7));
    irmX.put("v10", new Irm3PL(1.2525, -0.7164, 0.1493, 1.7));

    //gpcm items
    double[] step1 = { -2.1415, 0.0382, 0.6551 };
    irmX.put("v11", new IrmGRM(1.1196, step1, 1.7));

    double[] step2 = { -1.7523, -1.0660, 0.3533 };
    irmX.put("v12", new IrmGRM(1.2290, step2, 1.7));

    double[] step3 = { -2.3126, -1.8816, 0.7757 };
    irmX.put("v13", new IrmGRM(0.6405, step3, 1.7));

    double[] step4 = { -1.9728, -0.2810, 1.1387 };
    irmX.put("v14", new IrmGRM(1.1622, step4, 1.7));

    double[] step5 = { -2.2207, -0.8252, 0.9702 };
    irmX.put("v15", new IrmGRM(1.2249, step5, 1.7));

    //3pl items
    irmY.put("v1", new Irm3PL(0.7444, -1.5617, 0.1609, 1.7));
    irmY.put("v2", new Irm3PL(0.5562, -0.1031, 0.1753, 1.7));
    irmY.put("v3", new Irm3PL(0.5262, -1.0676, 0.1602, 1.7));
    irmY.put("v4", new Irm3PL(0.6388, -1.3880, 0.1676, 1.7));
    irmY.put("v5", new Irm3PL(0.8793, -0.2051, 0.1422, 1.7));
    irmY.put("v6", new Irm3PL(0.4105, 0.0555, 0.2120, 1.7));
    irmY.put("v7", new Irm3PL(0.7686, -0.3800, 0.2090, 1.7));
    irmY.put("v8", new Irm3PL(1.0539, -0.7570, 0.1270, 1.7));
    irmY.put("v9", new Irm3PL(0.7400, 0.0667, 0.1543, 1.7));
    irmY.put("v10", new Irm3PL(0.7479, 0.0281, 0.1489, 1.7));

    //gpcm items
    double[] step6 = { -1.7786, 0.7177, 1.45011 };
    irmY.put("v11", new IrmGRM(0.9171, step6, 1.7));

    double[] step7 = { -1.4115, -0.4946, 1.15969 };
    irmY.put("v12", new IrmGRM(0.9751, step7, 1.7));

    double[] step8 = { -1.8478, -1.4078, 1.51339 };
    irmY.put("v13", new IrmGRM(0.5890, step8, 1.7));

    double[] step9 = { -1.6151, 0.3002, 2.04728 };
    irmY.put("v14", new IrmGRM(0.9804, step9, 1.7));

    double[] step10 = { -1.9355, -0.2267, 1.88991 };
    irmY.put("v15", new IrmGRM(1.0117, step10, 1.7));

    UserSuppliedDistributionApproximation distX = new UserSuppliedDistributionApproximation(points, xDensity);
    UserSuppliedDistributionApproximation distY = new UserSuppliedDistributionApproximation(points, yDensity);

    StockingLordMethod sl = new StockingLordMethod(irmX, irmY, distX, distY, EquatingCriterionType.Q1Q2);
    sl.setPrecision(4);
    double[] startValues = { 0, 1 };

    int numIterpolationPoints = 2 * 2;//two dimensions A and B
    BOBYQAOptimizer underlying = new BOBYQAOptimizer(numIterpolationPoints);
    RandomGenerator g = new JDKRandomGenerator();
    RandomVectorGenerator generator = new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
    MultiStartMultivariateOptimizer optimizer = new MultiStartMultivariateOptimizer(underlying, 10, generator);
    PointValuePair optimum = optimizer.optimize(new MaxEval(1000), new ObjectiveFunction(sl), GoalType.MINIMIZE,
            SimpleBounds.unbounded(2), new InitialGuess(startValues));

    double[] slCoefficients = optimum.getPoint();
    sl.setIntercept(slCoefficients[0]);
    sl.setScale(slCoefficients[1]);

    System.out.println("  Iterations: " + optimizer.getEvaluations());
    System.out.println("  fmin: " + optimum.getValue());
    System.out.println("  B = " + slCoefficients[0] + "  A = " + slCoefficients[1]);

    assertEquals("  Intercept test", 0.735177, sl.getIntercept(), 1e-4);
    assertEquals("  Scale test", 1.213684, sl.getScale(), 1e-4);

    System.out.println();

}

From source file:com.itemanalysis.psychometrics.irt.equating.HaebaraMethodTest.java

/**
 * This test uses Rasch model items. True results from the sirt package in R.
 *
 *
 *//*  w  ww  .  j av a  2 s .com*/
@Test
public void raschModelTest() {
    System.out.println("Haebara test: Rasch model");

    LinkedHashMap<String, ItemResponseModel> itemFormX = new LinkedHashMap<String, ItemResponseModel>();
    LinkedHashMap<String, ItemResponseModel> itemFormY = new LinkedHashMap<String, ItemResponseModel>();

    itemFormX.put("Item1", new Irm3PL(-3.188047976, 1.0));
    itemFormX.put("Item2", new Irm3PL(1.031760328, 1.0));
    itemFormX.put("Item3", new Irm3PL(0.819040914, 1.0));
    itemFormX.put("Item4", new Irm3PL(-2.706947360, 1.0));
    itemFormX.put("Item5", new Irm3PL(-0.094527077, 1.0));
    itemFormX.put("Item6", new Irm3PL(0.689697135, 1.0));
    itemFormX.put("Item7", new Irm3PL(-0.551837153, 1.0));
    itemFormX.put("Item8", new Irm3PL(-0.359559276, 1.0));

    itemFormY.put("Item1", new Irm3PL(-3.074599226, 1.0));
    itemFormY.put("Item2", new Irm3PL(1.012824350, 1.0));
    itemFormY.put("Item3", new Irm3PL(0.868538408, 1.0));
    itemFormY.put("Item4", new Irm3PL(-2.404483603, 1.0));
    itemFormY.put("Item5", new Irm3PL(0.037402866, 1.0));
    itemFormY.put("Item6", new Irm3PL(0.700747420, 1.0));
    itemFormY.put("Item7", new Irm3PL(-0.602555046, 1.0));
    itemFormY.put("Item8", new Irm3PL(-0.350426446, 1.0));

    double f = 0;
    double[] param1 = new double[2];
    double[] param2 = new double[2];

    UniformDistributionApproximation distX = new UniformDistributionApproximation(-4.0, 4.0, 161);//plink default
    UniformDistributionApproximation distY = new UniformDistributionApproximation(-4.0, 4.0, 161);//plink default

    HaebaraMethod hb = new HaebaraMethod(itemFormX, itemFormY, distX, distY, EquatingCriterionType.Q1Q2);
    hb.setPrecision(6);
    double[] startValues = { 0 };//Using a start value for the intercept only for the Rasch family of models.

    DefaultUncminOptimizer optimizer = new DefaultUncminOptimizer();

    try {
        optimizer.minimize(hb, startValues);
        double[] r = optimizer.getParameters();
        param1[0] = r[0];
        param1[1] = 1;
        f = optimizer.getFunctionValue();
        hb.setIntercept(param1[0]);
        hb.setScale(param1[1]);

    } catch (UncminException ex) {
        ex.printStackTrace();
    }

    //Check Brent Optimizer values against results from plink.
    System.out.println("  UNCMIN Optimization");
    System.out.println("  Iterations: ");
    System.out.println("  fmin: " + f);
    System.out.println("  B = " + hb.getIntercept() + "  A = " + hb.getScale());

    assertEquals("  Intercept test", 0.065032, hb.getIntercept(), 1e-3);//true result from plink package in R
    assertEquals("  Scale test", 1.0, hb.getScale(), 1e-4);

    BrentOptimizer brentOptimizer = new BrentOptimizer(1e-8, 1e-8);
    UnivariatePointValuePair pair = brentOptimizer.optimize(new MaxEval(200),
            new UnivariateObjectiveFunction(hb),
            org.apache.commons.math3.optim.nonlinear.scalar.GoalType.MINIMIZE, new SearchInterval(-3, 3));

    param2 = new double[2];
    hb.setIntercept(pair.getPoint());
    hb.setScale(1.0);
    f = pair.getValue();

    param2[0] = pair.getPoint();
    param2[1] = 1;
    hb.setIntercept(param2[0]);
    hb.setScale(param2[1]);
    f = pair.getValue();

    //Check Brent results against plink results.
    System.out.println();
    System.out.println("  Brent Optimization");
    System.out.println("  Iterations: ");
    System.out.println("  fmin: " + f);
    System.out.println("  B = " + hb.getIntercept() + "  A = " + hb.getScale());

    assertEquals("  Haebara intercept test", 0.06468396, hb.getIntercept(), 1e-4);//True results from sirt package in R
    assertEquals("  Haebara scale test", 1.0, hb.getScale(), 1e-4);

    //Compare UMNCMIN and Brent optimizer results.
    assertEquals("  UNCMIN/Brent intercept test", param1[0], param2[0], 1e-4);
    assertEquals("  UNCMIN/Brent slope test", param1[1], param2[1], 1e-4);

}