summaryrefslogblamecommitdiffstats
path: root/admin/survey/R/class.SurveyAnalysisR.php
blob: 8a594af67ba7169d9062179ba2e46ee65e520737 (plain) (tree)

























































































































































































































































































































































                                                                                                                                                                                                                                 
<?php

/**
 * @date 11.6.2013
 *
 * @author: Peter Hrvatin
 *
 * @desc: racunanje analiz z R-jem (klicanje skript, obdelava rezultatov)
 *
 */

define("DATA_FOLDER", "admin/survey/R/TempData");
define("SCRIPT_FOLDER", "admin/survey/R/script");


class SurveyAnalysisR {

	public $ank_id;			# id ankete
	

	// Konstruktor
	public function __construct($anketa = null) {
		global $global_user_id, $site_path, $lang;

		if((int)$anketa > 0){
			
			$this->ank_id = $anketa;
		}
		else {
			die("Napaka!");
		}
	}
	
	
	// Pozenemo skripto za multicrosstabulacije
	public function createMultiCrosstabulation($crosstabVars=array(), $avgVar=0, $delezVars=array()){
		global $site_path;
		global $lang;
		
		// Skripta ki jo klicemo (glede na stevilo spremenljivk)		
		$script = $site_path . SCRIPT_FOLDER . '/';
		$script .= 'createCrosstabulation'.count($crosstabVars).'.R';

		
		// Prvi parameter je pot do r folderja
		$params = $site_path;		
		
		
		// Ce racunamo povprecje (avgVar==1)
		$params .= ' '.$avgVar;
			
		
		// variable pri katerih upostevamo delez
		$delezVar = 0;
		if(count($delezVars) > 0){
			
			// Gre za checkbox
			if($delezVars == -1){
				$params .= ' -1';
			}
			else{
				$params .= ' ';
				$cnt = 1;
				foreach($delezVars as $var){
					if($var == '1')
						$params .= $cnt.',';
					
					$cnt++;
				}
				$params = substr($params, 0, -1);
			}
			
			$delezVar = 1;
		}

		
		// pozenemo skripto
		$out = shell_exec('Rscript '.$script.' '.$params);


		//Rscript c:/Programs/WAMP/www/FDV/admin/survey/R/script/createCrosstabulation2.R c:/Programs/WAMP/www/FDV/ 0 -1
		

		// Napolnimo rezultate v array
		$results = $this->parseMultiCrosstabResults($out, $avgVar, $delezVar);
		
		return $results;
	}
	
	// Napolnimo podatke iz vrnjenega rezultata
	function parseMultiCrosstabResults($out, $avgVar=0, $delezVar=0){
		
		$results = array();
		
		// Razbijemo na variable, podatke in vsote
		$strings = explode("--", $out);
		
		
		// VARIABLE shranimo v array
		$varsString = explode("_", $strings[0]);
		$vars = array();
		foreach($varsString as $varString){
			$vars[] = explode(",", $varString);
		}
		//$results['vars'] = $vars;
	
		
		// PODATKE shranimo v array
		$tempData = explode("_", $strings[1]);
		$tempAvgData = explode("_", $strings[6]);
		$tempDelezData = ($avgVar == 1) ? explode("_", $strings[7]) : explode("_", $strings[6]);
		$data = array();
		$avgData = array();
		$delezData = array();
		$varCount = count($vars);
		
		// crosstab na 2 variablah
		if($varCount == 2){
		
			$dataKey = 0;
			foreach($vars[1] as $key2 => $var2){		
				foreach($vars[0] as $key1 => $var1){
					
					if((int)$var1 != -1 && (int)$var2 != -1 && $tempData[$dataKey] != null && $tempData[$dataKey] != 0)
						$data[(int)$var1][(int)$var2] = (int)$tempData[$dataKey];
					
					// Povprecje ce ga imamo
					if($avgVar == 1 && (int)$var1 != -1 && (int)$var2 != -1 && $tempAvgData[$dataKey] != null && $tempAvgData[$dataKey] != 0)
						$avgData[(int)$var1][(int)$var2] = (float)$tempAvgData[$dataKey];
						
					// Delez ce ga imamo
					if($delezVar == 1 && (int)$var1 != -1 && (int)$var2 != -1 && $tempDelezData[$dataKey] != null && $tempDelezData[$dataKey] != 0)
						$delezData[(int)$var1][(int)$var2] = (float)$tempDelezData[$dataKey];

					$dataKey++;
				}
			}
			$results['crosstab'] = $data;
			$results['avg'] = $avgData;
			$results['delez'] = $delezData;

			// VSOTE shranimo v array
			$sumsTemp = array_map('intval', explode("_", $strings[2]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[0][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaVrstica'] = $sums;
			
			$sumsTemp = array_map('intval', explode("_", $strings[3]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[1][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaStolpec'] = $sums;
			
			$sums = $strings[4];
			$results['sumaSkupna'] = (int)$sums;
		}		
		// crosstab na 3 variablah
		elseif($varCount == 3){
		
			$dataKey = 0;
			foreach($vars[2] as $key3 => $var3){		
				foreach($vars[1] as $key2 => $var2){
					foreach($vars[0] as $key1 => $var1){

						if((int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && $tempData[$dataKey] != null && $tempData[$dataKey] != 0)
							$data[(int)$var1][(int)$var2][(int)$var3] = (int)$tempData[$dataKey];
							
						// Povprecje ce ga imamo
						if($avgVar == 1 && (int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && $tempAvgData[$dataKey] != null && $tempAvgData[$dataKey] != 0)
							$avgData[(int)$var1][(int)$var2][(int)$var3] = (float)$tempAvgData[$dataKey];
							
						// Delez ce ga imamo
						if($delezVar == 1 && (int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && $tempDelezData[$dataKey] != null && $tempDelezData[$dataKey] != 0)
							$delezData[(int)$var1][(int)$var2][(int)$var3] = (float)$tempDelezData[$dataKey];
							
						$dataKey++;
					}
				}
			}
			$results['crosstab'] = $data;
			$results['avg'] = $avgData;
			$results['delez'] = $delezData;

			// VSOTE shranimo v array
			$sumsTemp = array_map('intval', explode("_", $strings[2]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[0][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaVrstica'] = $sums;
			
			$sumsTemp = array_map('intval', explode("_", $strings[3]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[1][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaStolpec'] = $sums;
			
			$sums = $strings[4];
			$results['sumaSkupna'] = (int)$sums;
		}
		// crosstab na 4 variablah
		elseif($varCount == 4){
			
			$dataKey = 0;
			foreach($vars[3] as $key4 => $var4){		
				foreach($vars[2] as $key3 => $var3){
					foreach($vars[1] as $key2 => $var2){
						foreach($vars[0] as $key1 => $var1){

							if((int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && (int)$var4 != -1 && $tempData[$dataKey] != null && $tempData[$dataKey] != 0)
								$data[(int)$var1][(int)$var2][(int)$var3][(int)$var4] = (int)$tempData[$dataKey];
							
							// Povprecje ce ga imamo
							if($avgVars == 1 && (int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && (int)$var4 != -1 && $tempAvgData[$dataKey] != null && $tempAvgData[$dataKey] != 0)
								$avgData[(int)$var1][(int)$var2][(int)$var3][(int)$var4] = (float)$tempAvgData[$dataKey];
								
							// Delez ce ga imamo
							if($delezVars == 1 && (int)$var1 != -1 && (int)$var2 != -1 && (int)$var3 != -1 && (int)$var4 != -1 && $tempDelezData[$dataKey] != null && $tempDelezData[$dataKey] != 0)
								$delezData[(int)$var1][(int)$var2][(int)$var3][(int)$var4] = (float)$tempDelezData[$dataKey];
								
							$dataKey++;
						}
					}
				}
			}
			$results['crosstab'] = $data;
			$results['avg'] = $avgData;
			$results['delez'] = $delezData;
			
			// VSOTE shranimo v array
			$sumsTemp = array_map('intval', explode("_", $strings[2]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[0][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaVrstica'] = $sums;
			
			$sumsTemp = array_map('intval', explode("_", $strings[3]));
			$sums = array();
			foreach($sumsTemp as $sumKey => $sum){
				$key = (int)$vars[1][$sumKey];
				$sums[$key] = $sum;
			}
			$results['sumaStolpec'] = $sums;
			
			$sums = $strings[4];
			$results['sumaSkupna'] = (int)$sums;
		}	
		else{
			$data = null;
		}
		
		
		// X^2
		$x2 = $strings[5];
		$results['hi2'] = (float)$x2;		
		
		
		return $results;
	}
	
	
	// Pozenemo skripto za ttest
	public function createTTest($vals){
		global $site_path;
		global $lang;
		
		// Skripta ki jo klicemo (glede na stevilo spremenljivk)		
		$script = $site_path . SCRIPT_FOLDER . '/';
		$script .= 'createTTest.R';

		
		// Prvi parameter je pot do r folderja
		$params = $site_path;
		
		
		// Drugi in tretji parameter - vrednost ki jo upostevamo (ce je checkbox sta oba 1 in jo kasneje ignoriramo)
		$params .= ' '.$vals[0].' '.$vals[1];
		

		// pozenemo skripto
		$out = shell_exec('Rscript '.$script.' '.$params);
		//echo $out;

		// Napolnimo rezultate v array
		$results = $this->parseTTestResults($out);
		
		//Rscript c:/Programs/WAMP/www/FDV/admin/survey/R/script/createTTest.R c:/Programs/WAMP/www/FDV/
		
		return $results;
	}
	
	// Napolnimo podatke iz vrnjenega rezultata
	function parseTTestResults($out){
		
		$results = array();			

		
		// Razbijemo na variable, podatke in vsote
		$strings = explode("--", $out);

		// Vrednosti prve variable
		$vals1 = explode("_", $strings[0]);
		$results['1'] = array(	
			'n' => (int)$vals1[0], 
			'x' => (float)$vals1[1], 
			's2' => (float)$vals1[2], 
			'se' => (float)$vals1[3], 
			'se2' => (float)$vals1[4], 
			'margin' => (float)$vals1[5]
		);
	
		// Vrednosti druge variable
		$vals2 = explode("_", $strings[1]);
		$results['2'] = array(
			'n' => (int)$vals2[0], 
			'x' => (float)$vals2[1], 
			's2' => (float)$vals2[2], 
			'se' => (float)$vals2[3], 
			'se2' => (float)$vals2[4], 
			'margin' => (float)$vals2[5]
		);

		// Skupne vrednosti
		$vals = explode("_", $strings[2]);
		$results['d'] = (float)$vals[0];
		$results['sed'] = (float)$vals[1];
		$results['t'] = (float)$vals[2];
		$results['sig'] = (float)$vals[3];

		
		return $results;
	}
	
}

?>