/**
 * Copyright (C) 2013-2017 Vasilis Vryniotis 
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.datumbox.framework.core.statistics.sampling;

import com.datumbox.framework.common.dataobjects.AssociativeArray;
import com.datumbox.framework.common.dataobjects.FlatDataCollection;
import com.datumbox.framework.common.dataobjects.FlatDataList;
import com.datumbox.framework.common.dataobjects.TypeInference;
import com.datumbox.framework.core.common.utilities.PHPMethods;
import com.datumbox.framework.core.statistics.descriptivestatistics.Descriptives;
import com.datumbox.framework.core.statistics.distributions.ContinuousDistributions;

import java.util.Map;

/**
 * This class provides methods which can be used for performing Simple Random Sampling.
 * 
 * @author Vasilis Vryniotis 
 */
public class SimpleRandomSampling {
    
    /**
     * Samples n ids based on their a Table which contains weights, probabilities 
     * or frequencies. 
     * 
     * @param weightedTable
     * @param n
     * @param withReplacement
     * @return 
     */
    public static FlatDataCollection weightedSampling(AssociativeArray weightedTable, int n, boolean withReplacement) {
        FlatDataList sampledIds = new FlatDataList();
        
        double sumOfFrequencies = Descriptives.sum(weightedTable.toFlatDataCollection());
        int populationN = weightedTable.size();
        
        for(int i=0;i entry : weightedTable.entrySet()) {
                Object pointID = entry.getKey();
                cumulativeFrequency+= TypeInference.toDouble(entry.getValue());
                if(cumulativeFrequency>=randomFrequency) {
                    if(withReplacement==false && sampledIds.contains(pointID)) {
                        continue;
                    }
                    
                    sampledIds.add(pointID);
                    break;
                }
            }
        }
    
        return sampledIds.toFlatDataCollection();
    }
    
    /**
     * Samples n ids by using SimpleRandomSampling (Simple Random Sampling).
     * 
     * @param idList
     * @param n
     * @param withReplacement
     * @return 
     */
    public static FlatDataCollection randomSampling(FlatDataList idList, int n, boolean withReplacement) {
        FlatDataList sampledIds = new FlatDataList();
        
        int populationN = idList.size();
        
        for(int i=0;ipopulationN) {
            throw new IllegalArgumentException("All the parameters must be positive and sampleN smaller than populationN.");
        }
        
        double xbarVariance=(1.0 - (double)sampleN/populationN)*variance/sampleN;
        
        return xbarVariance;
    }
    
    /**
     * Calculates Standard Deviation for Xbar for infinite population size
     * 
     * @param std
     * @param sampleN
     * @return 
     */
    public static double xbarStd(double std, int sampleN) {
        return Math.sqrt(xbarVariance(std*std, sampleN, Integer.MAX_VALUE));
    }
    
    /**
     * Calculates Standard Deviation for Xbar for finite population size
     * 
     * @param std
     * @param sampleN
     * @param populationN
     * @return 
     */
    public static double xbarStd(double std, int sampleN, int populationN) {
        return Math.sqrt(xbarVariance(std*std, sampleN, populationN));
    }
    
    /**
     * Calculates Variance for Pbar for infinite population size
     * 
     * @param pbar
     * @param sampleN
     * @return 
     */
    public static double pbarVariance(double pbar, int sampleN) {
        return pbarVariance(pbar, sampleN, Integer.MAX_VALUE);
    }
    
    /**
     * Calculates Variance for Pbar for a finite population size
     * 
     * @param pbar
     * @param sampleN
     * @param populationN
     * @return
     */
    public static double pbarVariance(double pbar, int sampleN, int populationN) {
        if(populationN<=0 || sampleN<=0 || sampleN>populationN) {
            throw new IllegalArgumentException("All the parameters must be positive and sampleN smaller than populationN.");
        }
        double f = (double)sampleN/populationN;
        double pbarVariance=((1.0 - f)*pbar*(1.0 - pbar))/(sampleN-1.0);
        
        return pbarVariance;
    }
    
    /**
     * Calculates Standard Deviation for Pbar for infinite population size
     * 
     * @param pbar
     * @param sampleN
     * @return 
     */
    public static double pbarStd(double pbar, int sampleN) {
        return Math.sqrt(pbarVariance(pbar, sampleN, Integer.MAX_VALUE));
    }
    
    /**
     * Calculates Standard Deviation for Pbar for finite population size
     * 
     * @param pbar
     * @param sampleN
     * @param populationN
     * @return 
     */
    public static double pbarStd(double pbar, int sampleN, int populationN) {
        return Math.sqrt(pbarVariance(pbar, sampleN, populationN));
    }
    
    /**
     * Returns the minimum required sample size when we set a specific maximum Xbar STD Error for infinite population size.
     * 
     * @param maximumXbarStd
     * @param populationStd
     * @return 
     */
    public static int minimumSampleSizeForMaximumXbarStd(double maximumXbarStd, double populationStd) {
        return minimumSampleSizeForMaximumXbarStd(maximumXbarStd, populationStd, Integer.MAX_VALUE);
    }
    
    /**
     * Returns the minimum required sample size when we set a specific maximum Xbar STD Error for finite population size.
     * 
     * @param maximumXbarStd
     * @param populationStd
     * @param populationN
     * @return 
     */
    public static int minimumSampleSizeForMaximumXbarStd(double maximumXbarStd, double populationStd, int populationN) {
        if(populationN<=0) {
            throw new IllegalArgumentException("The populationN parameter must be positive.");
        }
        
        double minimumSampleN = 1.0/(Math.pow(maximumXbarStd/populationStd,2) + 1.0/populationN);

        return (int)Math.ceil(minimumSampleN);
    }
    
    /**
     * Returns the minimum required sample size when we set a predifined limit d and a maximum probability Risk a for infinite population size
     * 
     * @param d
     * @param aLevel
     * @param populationStd
     * @return 
     */
    public static int minimumSampleSizeForGivenDandMaximumRisk(double d, double aLevel, double populationStd) {
        return minimumSampleSizeForGivenDandMaximumRisk(d, aLevel, populationStd, Integer.MAX_VALUE);
    }
    
    /**
     * Returns the minimum required sample size when we set a predefined limit d and a maximum probability Risk a for finite population size
     * 
     * @param d
     * @param aLevel
     * @param populationStd
     * @param populationN
     * @return 
     */
    public static int minimumSampleSizeForGivenDandMaximumRisk(double d, double aLevel, double populationStd, int populationN) {
        if(populationN<=0 || aLevel<=0 || d<=0) {
            throw new IllegalArgumentException("All the parameters must be positive.");
        }
        
        double a = 1.0 - aLevel/2.0;
        
        double Za = ContinuousDistributions.gaussInverseCdf(a);
        
        double V = Math.pow(d/Za,2);
        double Ssquare = populationStd*populationStd;
        double minimumSampleN = (Ssquare/V) * (1.0 / (1.0 + Ssquare/(populationN*V)) );
        /*
        double minimumSampleN=populationN/(
            1.0+populationN*pow(d/(Za*populationStd),2)
        );
        */
        return (int)Math.ceil(minimumSampleN);
    }
}

 

Ads help maintain this website.