メイン corr3.html Last modified: Sep 01, 2009
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;CHARSET=EUC-JP">
<link rel="shortcut icon" href="../favicon.ico">
<title>JavaScript</title>
<script src="io.js">document.write("io.js ファイルが見つかりません??<br>")</script>
<script language="JavaScript">
<!--
function pea(x, y, is, ie, l, ax, bx)
{
var i, mx, my, vx, vy, vxy, sdx, sdy, r, a, b, n, res
n = ie-is+1
mx = my = vx = vy = vxy = 0
for (i = is; i <= ie; i++) {
mx += x[i]; my += y[i]
}
mx /= n
my /= n
for (i = is; i <= ie; i++) {
vx += Math.pow(x[i]-mx, 2)
vy += Math.pow(y[i]-my, 2)
vxy += (x[i]-mx)*(y[i]-my)
}
vx /= n-1
vy /= n-1
vxy /= n-1
sdx = Math.sqrt(vx)
sdy = Math.sqrt(vy)
if (vx == 0) {
printf("回帰直線は定義できません。\n")
ax[l] = bx[l] = 0
return -999
}
else {
a = ax[l] = vxy/vx
b = bx[l] = my-a*mx
res = 0
for (i = is; i <= ie; i++) {
res += Math.pow(a*x[i]+b-y[i], 2)
}
return res
}
}
function sort(x, y, n)
{
var min, minp, i, j, temp
for (i = 0; i < n-1; i++) {
min = x[i]
minp = i
for (j = i; j < n; j++) {
if (x[j] < min) {
min = x[j]
minp = j
}
}
if (minp != i) {
x[minp] = x[i]
x[i] = min
temp = y[i]
y[i] = y[minp]
y[minp] = temp
}
}
}
function calc(data_string)
{
var i, nc, nv, data, x, y, residual, a0, b0, a1, b1, r0, min, minp, residual0, residual1, first, x1, y1
if ((data = getdata(data_string, 2)) == false) return
nc = data.length
nv = data[0].length
if (nc <= 5) {
printf("ケース数が5以下です\n")
return
}
x = new Array(nc)
y = new Array(nc)
a0 = new Array(nc)
b0 = new Array(nc)
a1 = new Array(nc)
b1 = new Array(nc)
r0 = new Array(nc)
for (i = 0; i < nc; i++) {
x[i] = data[i][0]
y[i] = data[i][1]
}
sort(x, y, nc)
printf("標本サイズ = %i\n\n", nc)
first = 1
for (i = 2; i < nc-3; i++) {
residual0 = pea(x, y, 0, i, i, a0, b0)
residual1 = pea(x, y, i+1, nc-1, i, a1, b1)
if (residual0 < 0 || residual1 < 0) {
residual = -99999
}
else {
residual = residual0+residual1
printf("分割点を %g と %g の間であるとしたとき\n", x[i], x[i+1])
printf(" 左側の %i 個のデータについて:\n 回帰直線の傾きは %g,切片は %g\n", i+1, a0[i], b0[i])
printf(" 右側の %i 個のデータについて:\n 回帰直線の傾きは %g,切片は %g\n", nc-i-1, a1[i], b1[i])
printf(" 残差平方和の和 = %g\n\n", residual)
}
r0[i] = residual
if (residual >= 0 && (first == 1 || residual < min)) {
first = 0
min = residual
minp = i
}
}
sep(20)
printf("分割点が %g と %g の間であるときが最も残差平方和が小さくなる(%g)\n", x[minp], x[minp+1], min)
printf("左側のデータについて:回帰直線の傾きは %g,切片は %g\n", a0[minp], b0[minp])
printf("右側のデータについて:回帰直線の傾きは %g,切片は %g\n", a1[minp], b1[minp])
x1 = (b0[minp]-b1[minp])/(a1[minp]-a0[minp])
y1 = x1*a0[minp]+b0[minp]
printf("2 本の直線の交点の座標は (%g, %g)\n", x1, y1)
printf("\n")
sep2(40)
printf("\n")
}
//-->
</script>
</head>
<body bgcolor="#ffffff">
<font size="+2"><b>二本の直線による折れ線回帰</b></font> <a href="src/corr3.html"><img src="png/src.png" width=35 height=11 alt="src" align=top></a> Last modified: Jun 01, 2006<hr noshade><p>
<font color="#ff0000" size="+2">以下のプログラムのサポートは終了しました。自己責任でお使い下さい。</font>
<form name=Result>
<script language="JavaScript">
<!--
//-->JavaScript がサポートされていないブラウザですか?
</script>
二変数データを入力する。独立変数の大きさの順に並べて左側部分と右側部分それぞれについて直線をあてはめる。データをどこで分割するともっともあてはめがよくなるかを自動探索する。<br>
<img src="../gra/button3.png" width=9 height=9 alt="・"> <a href="exa/corr3.html">使用法</a>
<hr>
<table><tr>
<td><input type="button" name="calcurate" value="計算開始" onClick="calc(this.form.data.value)"> </td>
<td><input type="button" name="clear" value="入力欄クリア" onClick="this.form.data.value=''"> </td>
<td><input type="button" name="clear" value="出力欄クリア" onClick="this.form.result.value=''"></td>
</tr></table>
<p>
<table><tr>
<td>入力欄<br><textarea name="data" ROWS=20 COLS=20></textarea></td>
<td>出力欄<br><textarea name="result" ROWS=20 COLS=80></textarea></td>
</tr></table>
</form>
<p><hr noshade>
<img src="../gra/button3.png" width=9 height=9 alt="・"> <A HREF="javascript:history.go(-1)">直前のページへ戻る</A> <img src="../gra/button3.png" width=9 height=9 alt="・"> <a href="../mail.html">E-mail to Shigenobu AOKI</a>
<p><IMG SRC="../gra/ume5.png" width=121 height=37 ALT="Made with Macintosh">
</body>
</html>
サブ io.js Last modified: Mar 25, 2004
直前のページへ戻る E-mail to Shigenobu AOKI