java实现独立性检验

描述

用于两个分类变量间的比较。

Demo

package com.math.demo;

import java.util.HashMap;
import java.util.Map;

import com.math.statistics.IndependenceTest;

public class IndependenceDemo {

    public static void main(String[] args) {
        Map<String, Double> map1=new HashMap<String, Double>();
        map1.put("a", 51.0);
        map1.put("b", 56.0);
        map1.put("c", 25.0);
        Map<String, Double> map2=new HashMap<String, Double>();
        map2.put("a", 39.0);
        map2.put("b", 21.0);
        map2.put("c", 8.0);
        IndependenceTest it=new IndependenceTest(map1,map2);
        System.out.println(it.getPValue());

    }

}

实现代码

package com.math.statistics;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import JSci.maths.statistics.ChiSqrDistribution;
/***
 * @author miaoyibo
 *
 */
public class IndependenceTest {

    private Map<String, Double> map1;

    private Map<String, Double> map2;

    public IndependenceTest(Map<String, Double> map1, Map<String, Double> map2) {
        super();
        this.map1 = map1;
        this.map2 = map2;
    }

    public double getSum() {
        double sum1 = map1.values().stream().reduce(Double::sum).orElse((double) 0);
        double sum2 = map2.values().stream().reduce(Double::sum).orElse((double) 0);
        return sum1 + sum2;
    }

    public double getMap1Sum() {
        return map1.values().stream().reduce(Double::sum).orElse((double) 0);
    }

    public double getMap2Sum() {
        return map2.values().stream().reduce(Double::sum).orElse((double) 0);
    }

    /**
     * 2为map的数量
     * 
     * @return
     */
    public double getDegreesOfFreedom() {
        return (map1.keySet().size() - 1) * (2 - 1);
    }

    public Map<String, Double> getScale() {
        Set<String> keySet = map1.keySet();
        Map<String, Double> scale = new HashMap<String, Double>();
        for (String key : keySet) {
            scale.put(key, (map1.get(key) + map2.get(key)) / getSum());
        }
        return scale;
    }

    public double getPValue() {
        double map1Sum = getMap1Sum();
        double map2Sum = getMap2Sum();
        double x = 0;
        Map<String, Double> scale = getScale();
        Set<String> keySet = map1.keySet();
        for (String key : keySet) {
            double sampleValue1 = map1.get(key);
            double expectValue1 = map1Sum * scale.get(key);
            double map1KeyFre = ((sampleValue1 - expectValue1) * (sampleValue1 - expectValue1)) / expectValue1;

            double sampleValue2 = map2.get(key);
            double expectValue2 = map2Sum * scale.get(key);
            double map2KeyFre = ((sampleValue2 - expectValue2) * (sampleValue2 - expectValue2)) / expectValue2;

            x = x + map1KeyFre + map2KeyFre;

        }
        ChiSqrDistribution cd = new ChiSqrDistribution(getDegreesOfFreedom());
        return 1 - cd.cumulative(x);
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 很难得江南水乡飘来了雪精灵的愿望,丝丝点点,纤纤萧萧地滑进了大街小巷。昭示着冬天的讯息的雪儿们飘飞如柳絮的...
    幼澜阅读 302评论 0 0
  • 根据镇委、镇政府有关“全民禁毒工程”的工作要求,为切实加强禁毒巡查工作全面、深入的开展,有效遏制毒品的渗透蔓...
  • 人为什么要改掉缺点——因为你不知道,那些你习以为常的行为,什么时候突然就寒了某一个人的心
    煙水袖阅读 233评论 0 0

友情链接更多精彩内容