<?php
namespace model\doctor;
/**
 * Class blood
 * @package model
 */
class tool extends \model
{
	public function __construct()
    {
		parent::__construct();
	}

	public function getMeasureReport($bigCate,$device)
    {
        $rows = [];
        $sql = "SELECT * FROM dt_measure 
                WHERE mea_mead_id={:device} AND mea_value_home<>'' AND mea_value<>'' 
                AND EXISTS(SELECT 1 FROM dt_measure_type WHERE mea_cid = meat_id AND meat_name='{:bigCate}')
                ORDER BY mea_date,mea_time,mea_id";
        $sql = qgprintf($sql,['bigCate'=>$bigCate,'device'=>$device]);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $hasData = 0;
        $hospitalDates = [];
        $ourDates = [];
        $hospital = [];
        $home = [];
        $intercept = 0;
        $slope = 0;
        $correlation_coefficient = 0;
        foreach($rows as $row){
            $hospital[] = $row['mea_value'];
            $home[] = $row['mea_value_home'];
        }
        if(count($hospital)>2 && count($home)>1){
            list($intercept,$slope,$correlation_coefficient) = $this->getInterceptSlope($hospital,$home);
            $hasData = 1;
        }
		$data = [
			'hasData'=> $hasData,
			//'hospital'=> $hospital,
			'our'=> $our,
			'intercept'=> $intercept,
			'slope'=> $slope,
			'correlation_coefficient'=> $correlation_coefficient,
		];
		return $data;        
	}
	
	public function getMeasureCorrelations()
    {
        $sql = "SELECT mea_mead_id,meat_name FROM dt_measure 
                JOIN dt_measure_type ON meat_id = mea_cid
                WHERE mea_mead_id>0 AND mea_value<>'' 
                GROUP BY mea_mead_id,meat_name";
        $sql = qgprintf($sql);
        $st = $this->db->query($sql);
        $rows = $st->fetchAll(\PDO::FETCH_ASSOC);
        $data = [];
        foreach($rows as $row){
            $key = md5($row['mea_mead_id'].'.'.$row['meat_name']);
            $data[$key] = $this->getMeasureReport($row['meat_name'],$row['mea_mead_id']);
        }
		return $data;        
	}
	
	//计算线性回归方程的截距和斜率,以及相关系数
	public function getInterceptSlope($arrA,$arrB)
    {
        //截距和斜率
        $measurements = [];
        foreach($arrA as $k=>$v) {
            $systolic_pressure = $arrA[$k];
            $diastolic_pressure = $arrB[$k]; 
            $measurements[] = ['systolic' => $systolic_pressure, 'diastolic' => $diastolic_pressure];
        }
        $sum_x = 0;
        $sum_y = 0;
        $sum_xy = 0;
        $sum_x_squared = 0;
        $count = count($measurements);
        
        foreach ($measurements as $measurement) {
            $sum_x += $measurement['systolic'];
            $sum_y += $measurement['diastolic'];
            $sum_xy += $measurement['systolic'] * $measurement['diastolic'];
            $sum_x_squared += pow($measurement['systolic'], 2);
        }
        
        $slope = ($count * $sum_xy - $sum_x * $sum_y) / ($count * $sum_x_squared - pow($sum_x, 2));
        $intercept = ($sum_y - $slope * $sum_x) / $count;
        
        //相关系数
        $systolic_values = array_column($measurements, 'systolic');
        $predicted_diastolic_values = array_map(function($x) use ($intercept, $slope) {
            return $intercept + $slope * $x;
        }, $systolic_values);
        $diastolic_values = array_column($measurements, 'diastolic');
        $correlation_coefficient = $this->correlation_coefficient($predicted_diastolic_values, $diastolic_values);
                
        return [$intercept,$slope,$correlation_coefficient];
    }	
    
    // 计算相关系数函数
    public function correlation_coefficient($x, $y) {
        $n = count($x);
        $mean_x = array_sum($x) / $n;
        $mean_y = array_sum($y) / $n;
        $covariance = 0;
        $variance_x = 0;
        $variance_y = 0;
        for ($i = 0; $i < $n; $i++) {
            $covariance += ($x[$i] - $mean_x) * ($y[$i] - $mean_y);
            $variance_x += pow($x[$i] - $mean_x, 2);
            $variance_y += pow($y[$i] - $mean_y, 2);
        }
        $correlation_coefficient = $covariance / sqrt($variance_x * $variance_y);
        return $correlation_coefficient;
    }    
}