Skip to content

Instantly share code, notes, and snippets.

@gcchaan
Created February 24, 2013 11:11
Show Gist options
  • Save gcchaan/5023433 to your computer and use it in GitHub Desktop.
Save gcchaan/5023433 to your computer and use it in GitHub Desktop.
生物統計学。カイ二乗検定(データ形式:2×m) Chi-Square Test of Independence (for biostatistics)
<html lang=ja>
<head>
<meta http-equiv="Content-Type" content="text/HTML; charset=EUC-JP">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css">
<!--
.top {border-top: 1px solid #000000;}
.jouge {border-top: 1px solid #000000;
border-bottom: 1px solid #000000;}
.bot {border-bottom: 1px solid #000000;}
-->
</style>
</head>
<body>
2×m分割表
<?php
error_reporting(E_WARNING);
include("./7kai_hyou.php");
$m_number =null;
if( isset($_GET['m_number']))
$m_number = $_GET['m_number'];
$atai =null;
if( isset($_GET['atai']))
$atai = $_GET['atai'];
$m_alphabet = str_split("0ABCDEFGHIJKLMNOPQRSTUVWXYZ");
if($atai != null){
//総和・平均
for($j=1;$j<=2;$j++){
for($i=1;$i<=$m_number;$i++){
$sum[$j]+=$atai[$j][$i]; //標本毎
$sum_k[$i]+=$atai[$j][$i]; //項目毎
$hassei[$i] = $atai[1][$i]/$sum_k[$i]*100;
}
// $reisuu_wa +=$reisuu; //データ総数
$souwa_wa += $sum[$j]; //各標本の総和の和
}
//期待値
for($j=1;$j<=2;$j++){
for($i=1;$i<=$m_number;$i++){
$mean[$j]=$sum_k[$i]/$souwa_wa;
$theory[$j][$i]=$sum[$j]*$mean[$j];
$x2+=pow($atai[$j][$i]-$theory[$j][$i],2)/$theory[$j][$i];
}
}
//自由度
$df=$m_number-1;
//区間同士の組み合わせ
$kumi_n = round($m_number/2,0);
//四捨五入
for($j=1;$j<=2;$j++){
for($i=1;$i<=$m_number;$i++){
$theory[$j][$i]=round($theory[$j][$i],2);
$hassei[$i]=round($hassei[$i],1);
}
}
$x2=round($x2,4);
}
if($atai == null){
if($m_number == null){
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=GET>";
echo "m数:<input type=text name=m_number size=3>\n";
echo "<input type=submit name=submit value=\"送信\">";
echo "</form>";
}
}
if($m_number != null){
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=GET>\n";
echo "<table>\n<tr><td class=\"jouge\">No.</td>";
for($i=1;$i<=$m_number;$i++){
echo "<td class=\"jouge\">$m_alphabet[$i]</td>";
}
if($atai != null){echo "<td class=\"jouge\">Σ</td>";}
echo "</tr>\n";
for($j=1;$j<=2;$j++){
echo "<tr><td>$j</td>";
for($i=1;$i<=$m_number;$i++){
echo "<td><input type=text size=3 name=atai[$j][$i] value=".$atai[$j][$i].">";
if($atai != null){echo "(".$theory[$j][$i].")";}
}
if($atai != null){echo "<td>$sum[$j]</td>";}
echo "</tr>\n";
}
if($atai != null){echo "<tr><td class=\"jouge\">Σ</td>\n";
for($j=1;$j<=$m_number;$j++){echo "<td class=\"jouge\">$sum_k[$j]</td>";}
echo "<td class=\"jouge\">$souwa_wa</td>";
}
echo "</table>\n";
echo "<input type=hidden name=m_number value=$m_number>\n";
echo "<input type=submit name=submit value=\"送信\">\n";
}
if($atai!=null){
print <<< DOC_END
():期待値
<br><br>
χ2の算出
<br>
DOC_END;
if($atai != null){echo "χ2=";}
for($j=1;$j<=2;$j++){
for($i=1;$i<=$m_number;$i++){
echo "(".$atai[$j][$i]."-".$theory[$j][$i].")^2/".$theory[$j][$i]."+";
}
}
print <<< DOC_END
={$x2}
<br><br>
自由度(df)を求める。
<br>
自由度(df)=(行-1)(列-1)=(2-1)({$m_number}-1)={$df}
<br><br>
検定
<br>
DOC_END;
if($x2>$kai_hyou[1][$df]){
print <<< DOC_END
χ2={$x2}はχ2分布表の{$kai_hyou[1][$df]}(df={$df},p=0.01)より大きいため、帰無仮説({$m_number}種の+率に差がない)は棄却され、いずれかの区間の+率に有意差がある。<br><br>
DOC_END;
for($j=1;$j<=$m_number-1;$j++){
for($i=$j+1;$i<=$m_number;$i++){
$kukan_sum[$j]=$atai[1][$j]+$atai[2][$j];
$kukan_sum2[$i]=$atai[1][$i]+$atai[2][$i];
$rate_sum=$atai[1][$j]+$atai[1][$i];
$rate_sum2=$atai[2][$j]+$atai[2][$i];
$goukei=$rate_sum+$rate_sum2;
$tasuki=$atai[1][$j]*$atai[2][$i]-$atai[1][$i]*$atai[2][$j];
$x2_22=$goukei*pow($tasuki,2)/$kukan_sum[$j]/$kukan_sum2[$i]/$rate_sum/$rate_sum2;
$x2_22=round($x2_22,3);
echo $m_alphabet[$j]."と".$m_alphabet[$i]."の+率の差の検定をすると<br>\n";
print <<< DOC_END
<table>
<tr><td class="jouge">区間/</td><td class="jouge">+</td><td class="jouge">-</td><td class="jouge">Σ</td></tr>
<tr><td>{$m_alphabet[$j]}</td><td>{$atai[1][$j]}</td><td>{$atai[2][$j]}</td><td>{$kukan_sum[$j]}</td></tr>
<tr><td>{$m_alphabet[$i]}</td><td>{$atai[1][$i]}</td><td>{$atai[2][$i]}</td><td>{$kukan_sum2[$i]}</td></tr>
<tr><td class="jouge">Σ</td><td class="jouge">{$rate_sum}</td><td class="jouge">{$rate_sum2}</td><td class="jouge">{$goukei}</td></tr>
</table>
 χ2={$x2_22}
<br>
DOC_END;
if($x2_22>$kai_hyou[1][1]){
$kenteikekka[$j][$i]=1;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[1][1]}(df=1,p=0.01)より大きいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}の+率の差は有意である。<br><br>
DOC_END;
}elseif($kai_hyou[1][1]>$x2_22 && $x2_22>$kai_hyou[5][1]){
$kenteikekka[$j][$i]=5;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[5][1]}(df=1,p=0.05)より大きいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}の+率の差は有意である。<br><br>
DOC_END;
}else{
$kenteikekka[$j][$i]=0;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[5][1]}(df=1,p=0.05)より小さいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}に差があるとは言えない。
<br><br>
DOC_END;
}
}
}
echo "<H3>結果</H3>\n";
/*
echo "<table>";
*/
echo "<table><tr><td class=\"jouge\"> </td>";
for($i=1;$i<=$m_number;$i++){
echo "<td class=\"jouge\">$m_alphabet[$i]</td>";
}
echo "</tr><tr><td class=\"bot\">発生割合(%)</td>";
for($i=1;$i<=$m_number;$i++){
echo "<td class=\"bot\">$hassei[$i]</td>";
}
}elseif($kai_hyou[1][$df]>$x2 && $x2>$kai_hyou[5][$df]){
print <<< DOC_END
χ2={$x2}はχ2分布表の{$kai_hyou[5][$df]}(df={$df},p=0.05)より大きいため、帰無仮説({$m_number}種の+率に差がない)は棄却され、いずれかの区間の+率に有意差がある。
DOC_END;
for($j=1;$j<=$m_number-1;$j++){
for($i=$j+1;$i<=$m_number;$i++){
$kukan_sum[$j]=$atai[1][$j]+$atai[2][$j];
$kukan_sum2[$i]=$atai[1][$i]+$atai[2][$i];
$rate_sum=$atai[1][$j]+$atai[1][$i];
$rate_sum2=$atai[2][$j]+$atai[2][$i];
$goukei=$rate_sum+$rate_sum2;
$tasuki=$atai[1][$j]*$atai[2][$i]-$atai[1][$i]*$atai[2][$j];
$x2_22=$goukei*pow($tasuki,2)/$kukan_sum[$j]/$kukan_sum2[$i]/$rate_sum/$rate_sum2;
$x2_22=round($x2_22,3);
echo $m_alphabet[$j]."と".$m_alphabet[$i]."の+率の差の検定をすると<br>\n";
print <<< DOC_END
<table>
<tr><td class="jouge">区間/</td><td class="jouge">+</td><td class="jouge">-</td><td class="jouge">Σ</td></tr>
<tr><td>{$m_alphabet[$j]}</td><td>{$atai[1][$j]}</td><td>{$atai[2][$j]}</td><td>{$kukan_sum[$j]}</td></tr>
<tr><td>{$m_alphabet[$i]}</td><td>{$atai[1][$i]}</td><td>{$atai[2][$i]}</td><td>{$kukan_sum2[$i]}</td></tr>
<tr><td class="jouge">Σ</td><td class="jouge">{$rate_sum}</td><td class="jouge">{$rate_sum2}</td><td class="jouge">{$goukei}</td></tr>
</table>
 χ2={$x2_22}
<br>
DOC_END;
if($x2_22>$kai_hyou[1][1]){
$kenteikekka[$j][$i]=1;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[1][1]}(df=1,p=0.01)より大きいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}の+率の差は有意である。<br><br>
DOC_END;
}elseif($kai_hyou[1][1]>$x2_22 && $x2_22>$kai_hyou[5][1]){
$kenteikekka[$j][$i]=5;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[5][1]}(df=1,p=0.05)より大きいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}の+率の差は有意である。<br><br>
DOC_END;
}else{
$kenteikekka[$j][$i]=0;
print <<< DOC_END
χ2={$x2_22}はχ2分布表の{$kai_hyou[5][1]}(df=1,p=0.05)より小さいため、区間{$m_alphabet[$j]}と区間{$m_alphabet[$i]}に差があるとは言えない。
<br><br>
DOC_END;
}
}
}
}else{
print <<< DOC_END
χ2={$x2}はχ2分布表の{$kai_hyou[5][$df]}(df={$df},p=0.05)より小さいため、帰無仮説({$m_number}種の+率に差がない)は棄却されない。
<br>
すなわち、{$m_number}種の+率に差があるとは言えない。
DOC_END;
}
}
?>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment