com.itemanalysis.jmetrik.stats.irt.linking.DbThetaDistribution.java Source code

Java tutorial

Introduction

Here is the source code for com.itemanalysis.jmetrik.stats.irt.linking.DbThetaDistribution.java

Source

/*
 * Copyright (c) 2012 Patrick Meyer
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.itemanalysis.jmetrik.stats.irt.linking;

import com.itemanalysis.jmetrik.sql.DataTableName;
import com.itemanalysis.psychometrics.data.VariableName;
import com.itemanalysis.psychometrics.distribution.ContinuousDistributionApproximation;
import com.itemanalysis.psychometrics.distribution.DistributionApproximation;
import com.itemanalysis.psychometrics.distribution.UserSuppliedDistributionApproximation;
import com.itemanalysis.squiggle.base.SelectQuery;
import com.itemanalysis.squiggle.base.Table;
import org.apache.commons.math3.stat.descriptive.rank.Max;
import org.apache.commons.math3.stat.descriptive.rank.Min;
import org.apache.commons.math3.util.ResizableDoubleArray;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class DbThetaDistribution {

    //    UserSuppliedDistributionApproximation dist = null;
    private ArrayList<Double> points = null;
    private ArrayList<Double> weights = null;

    public DbThetaDistribution() {

    }

    public DistributionApproximation getDistribution(Connection conn, DataTableName tableName,
            VariableName thetaName, VariableName weightName, boolean hasWeight) throws SQLException {

        points = new ArrayList<Double>();
        Min min = new Min();
        Max max = new Max();

        Table sqlTable = new Table(tableName.getNameForDatabase());
        SelectQuery query = new SelectQuery();
        query.addColumn(sqlTable, thetaName.nameForDatabase());
        if (hasWeight) {
            query.addColumn(sqlTable, weightName.nameForDatabase());
            weights = new ArrayList<Double>();
        }

        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = stmt.executeQuery(query.toString());
        double value = 0.0;
        double w = 1.0;

        while (rs.next()) {
            value = rs.getDouble(thetaName.nameForDatabase());
            if (!rs.wasNull()) {
                if (hasWeight) {
                    w = rs.getDouble(weightName.nameForDatabase());
                    if (rs.wasNull()) {
                        w = 0.0;
                    }
                    points.add(value);
                    weights.add(w);
                    min.increment(value);
                    max.increment(value);
                } else {
                    points.add(value);
                    min.increment(value);
                    max.increment(value);
                }
            }
        }
        rs.close();
        stmt.close();

        ContinuousDistributionApproximation dist = new ContinuousDistributionApproximation(points.size(),
                min.getResult(), max.getResult());

        if (hasWeight) {
            for (int i = 0; i < points.size(); i++) {
                dist.setPointAt(i, points.get(i));
                dist.setDensityAt(i, weights.get(i));
            }
        } else {
            for (int i = 0; i < points.size(); i++) {
                dist.setPointAt(i, points.get(i));
            }
        }

        return dist;

    }

}