JS 计算两组数据的斜率、截距和R^2

 let r=XGX.pearson([0.3,50.2,99.5,199.3,299,398],[0.1,50,99.9,200,300,400]);
          let slope=XGX.slope([0.3,50.9,100.8,200,300,400],[0.2,50,100.2,200,300,400]);
          let intercept=XGX.intercept([0.3,50.2,99.5,199.3,299,398],[0.1,50,99.9,200,300,400]);

let XGX= {
    /**
     * 计算皮尔逊相关系数
     * @list1:数字列表1
     * @list2:数字列表2
     * @return number
    * */
    pearson(list1,list2){
        let newList = [];
        let len = list1.length;
        for(let i=0;i<len;i++){newList.push(list1[i]*list2[i]);}
        let mean1 = this.mean(list1),mean2=this.mean(list2);
        let cov = this.mean(newList)-mean1*mean2;
        return cov/(this.std(list1,mean1)*this.std(list2,mean2))
    },
    /**
     * 计算平均值
     * @list:数字列表
     * @return number
     * */
    mean(list){
        let sum = 0;
        list.forEach((item)=>{sum+=item})
        return sum/list.length;
    },
    /**
     * 计算标准差
     * @list:数字列表
     * @mean:列表list的平均值
     * @return number
     * */
    std(list,mean){
        let sum =0;
        list.forEach((item)=>{sum+=Math.pow(item-mean,2)})
        return Math.sqrt(sum/list.length)
    },
    slope(x,y){
        let sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;       
        for (let i = 0; i < x.length; i++)
        {
            sum_x += x[i];
            sum_y += y[i];
            sum_xy += x[i] * y[i];
            sum_xx += x[i] * x[i];
        }      
        let slope = (x.length * sum_xy - sum_x * sum_y) / (x.length * sum_xx - sum_x * sum_x);
        return slope;
    },
    intercept(x,y){
        let sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;       
        for (let i = 0; i < x.length; i++)
        {
            sum_x += x[i];
            sum_y += y[i];
            sum_xy += x[i] * y[i];
            sum_xx += x[i] * x[i];
        }      
        let slope = (x.length * sum_xy - sum_x * sum_y) / (x.length * sum_xx - sum_x * sum_x);
        let intercept = (sum_y - slope * sum_x) / x.length;
        return intercept;
    },
    r_squared(){
        let sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;       
        for (let i = 0; i < x.length; i++)
        {
            sum_x += x[i];
            sum_y += y[i];
            sum_xy += x[i] * y[i];
            sum_xx += x[i] * x[i];
        }      
        let slope = (x.length * sum_xy - sum_x * sum_y) / (x.length * sum_xx - sum_x * sum_x);
        let intercept = (sum_y - slope * sum_x) / x.length;
        let y_mean = sum_y / y.length;
        let ss_tot = 0, ss_res = 0;
        for (let i = 0; i < x.length; i++)
        {
            let y_pred = slope * x[i] + intercept;
            ss_tot += (y[i] - y_mean) * (y[i] - y_mean);
            ss_res += (y[i] - y_pred) * (y[i] - y_pred);
        }
        let r_squared = 1 - ss_res / ss_tot;
        return r_squared;
    },
};
export default XGX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值