メイン qt1.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="txp.js">document.write("txp.js ファイルが見つかりません??<br>")</script>
<script src="inv.js">document.write("inv.js ファイルが見つかりません??<br>")</script>
<script src="io.js">document.write("io.js ファイルが見つかりません??<br>")</script>
<script language="JavaScript">
<!--
function zfi(w, i)
{
var ww = (""+i).length
ww = ww > w ? 0 : w-ww
return "0000000000000".substring(0, ww)+i
}
function vname(i)
{
return "Var"+zfi(2, i+1)
}
function sort(x, n, ip)
{
var min, minp, i, j, temp
for (i = 0; i < n-1; i++) {
min = x[i][ip]
minp = i
for (j = i+1; j < n; j++) {
if (x[j][ip] < min) {
min = x[j][ip]
minp = j
}
}
if (i != minp) {
temp = x[i][ip]
x[i][ip] = min
x[minp][ip] = temp
}
}
for (i = 0; i < n; i++) {
if (x[i][ip] != i+1) {
return 0
}
}
return 1
}
function itemno(data, nc, item, cat, junjo, value)
{
var i, j, k, nobe, flag0 = 0, flag, work, catj
for (j = 0; j < item; j++) {
catj = flag = 0
for (i = 0; i < nc; i++) {
work = data[i][j]
if (Math.floor(work) != work) {
if (flag == 0) {
printf("アイテム変数 %s が,整数値でありません。\n", vname(j))
flag = flag0 = 1
}
}
value[catj][j] = work
for (k = 0; k <= catj; k++) {
if (value[k][j] == work) {
break
}
}
if (k == catj) {
catj++
if (catj > 100) {
printf("アイテム変数 %s の取る値の種類が多すぎます。\n", vname(j))
flag0 = 1
break
}
}
}
cat[j] = catj
if (catj == 1) {
printf("アイテム変数 %s は,一種類の値しか取りません。この変数は分析に使用しないでください。\n", vname(j))
flag0 = 1
}
else if (sort(value, catj, j) == 0) {
for (i = 0; i < nc; i++) {
work = data[i][j]
for (k = 0; k < catj; k++) {
if (work != k+1 && work == value[k][j]) {
data[i][j] = k+1
break
}
}
}
}
}
if (flag0) {
return -99
}
else {
nobe = 0
for (i = 0; i < item; i++) {
junjo[i] = nobe
nobe += cat[i]
}
return nobe
}
}
function r_matrix(item, r)
{
var i, ie, is, j, itemp
printf("\n***** 相関係数行列 *****\n")
for (is = ie = 0; ie != item+1; is = ie) {
ie = Math.min(is+Math.floor(75/9), item+1)
printf("\n")
for (i = is; i <= item; i++) {
itemp = i ? i-1 : item
printf("%8s", vname(itemp))
for (j = is; j <= Math.min(i, ie-1); j++) {
printf("%9.5f", r[j][i])
}
printf("\n")
}
printf(" ")
for (j = is; j < ie; j++) {
printf(" %8s", (j) ? vname(j-1) : vname(item))
}
printf("\n")
}
}
function calc(data_string)
{
var cat, junjo, isw, p, jf, i, ie, irank, is, item, j, je, js, k, l, m, nobe, ncase, a, a1, b, out, part, xvar
var f, r, cons, fnc, pred, rm, rr, sum, syy, xx, xy, y, yy, value
var nc, nv, data, partt, partp, partdf
printf("★ 数量化 I 類 ★\n\n")
if ((data = getdata(data_string, 0)) == false) return
nc = data.length
nv = data[0].length
if (nc < 2) {
printf("ケース数が1以下です\n")
return
}
item = nv-1
cat = makeVector(item)
junjo = makeVector(item)
value = makeMatrix(100, item)
nobe = itemno(data, nc, item, cat, junjo, value)
if (nobe <= 0) {
printf("データをチェックしてください\n")
return
}
else if (nobe >= 500) {
printf("カテゴリーが多すぎます\n")
return
}
part = makeVector(item)
xvar = makeVector(item)
a = makeVector(nobe)
a1 = makeVector(nobe)
b = makeVector(nobe)
p = makeVector(nobe)
isw = makeVector(nobe)
out = makeVector(nobe)
r = makeMatrix(item+1, item+1)
f = makeMatrix(nobe, nobe)
jf = makeMatrix(nobe, nobe)
for (i = 0; i < nobe; i++) {
a[i] = 0
for (j = 0; j < nobe; j++) {
jf[i][j] = 0
}
}
cons = syy = 0.0
ncase = 0
for (i = 0; i < nc; i++) {
y = data[i][item]
ncase++
cons += y
syy += y*y
for (j = 0; j < nobe; j++) {
p[j] = 0
}
for (j = 0; j < item; j++) {
k = junjo[j]+data[i][j]-1
p[k] = 1
a[k] += y
}
for (j = 0; j < nobe; j++) {
if (p[j] != 0) {
for (k = 0; k < nobe; k++) {
jf[k][j] += p[j]*p[k]
}
}
}
}
fnc = ncase
printf("有効ケース数: %i\n", ncase)
printf("従属変数: %8s\n\n", vname(item))
printf("独立変数: アイテム カテゴリー数\n")
for (i = 0; i < item; i++) {
printf("%16s%8s %9i\n", "", vname(i), cat[i])
}
syy -= cons*cons/fnc
cons /= fnc
for (i = 0; i < nobe; i++) {
out[i] = a[i]
isw[i] = 1
}
for (i = 1; i < item; i++) {
isw[junjo[i]] = 0
}
l = 0
for (i = 0; i < nobe; i++) {
if (isw[i] == 1) {
a1[l] = a[i]
m = 0
for (j = 0; j < nobe; j++) {
if (isw[j] == 1) {
f[m++][l] = jf[j][i]
}
}
l++
}
}
irank = l
if (inv(f, irank, 1e-8) == 1) {
printf("逆行列が求まりません。カテゴリーへの反応が一次従属です\n")
return
}
for (i = 0; i < irank; i++) {
b[i] = 0.0
for (j = 0; j < irank; j++) {
b[i] += f[j][i]*a1[j]
}
}
l = 0
for (i = 0; i < nobe; i++) {
a[i] = (isw[i] == 0) ? 0.0 : b[l++]
}
for (i = 0; i < item; i++) {
sum = 0.0
is = junjo[i]
ie = junjo[i]+cat[i]
for (j = is; j < ie; j++) {
sum += a[j]*jf[j][j]
}
sum /= fnc
xvar[i] = sum
for (j = is; j < ie; j++) {
b[j] = a[j]-sum
}
}
rr = -fnc*cons*cons
for (i = 0; i < nobe; i++) {
rr += a[i]*out[i]
}
rr /= syy
rm = Math.sqrt(rr)
for (i = 0; i < item; i++) {
is = junjo[i]
ie = junjo[i]+cat[i]
xx = -fnc*xvar[i]*xvar[i]
for (k = is; k < ie; k++) {
xx += jf[k][k]*a[k]*a[k]
}
a1[i] = xx
}
r[0][0] = 1.0
for (i = 1; i <= item; i++) {
is = junjo[i-1]
ie = junjo[i-1]+cat[i-1]
yy = -fnc*xvar[i-1]*cons
for (l = is; l < ie; l++) {
yy += a[l]*out[l]
}
r[0][i] = yy/Math.sqrt(a1[i-1]*syy)
for (j = 1; j <= i; j++) {
js = junjo[j-1]
je = junjo[j-1]+cat[j-1]
xy = -fnc*xvar[i-1]*xvar[j-1]
for (k = js; k < je; k++) {
for (l = is; l < ie; l++) {
xy += jf[l][k]*a[k]*a[l]
}
}
r[j][i] = xy/Math.sqrt(a1[i-1]*a1[j-1])
}
}
for (i = 0; i <= item; i++) {
for (j = 0; j <= i; j++) {
r[i][j] = r[j][i]
}
}
r_matrix(item, r)
if (inv(r, item+1, 1e-8) == 1) {
printf("逆行列が求まらないので,偏相関係数を計算できません。\n以下の結果の偏相関係数のところは 9.99999 という無効な数値で埋めておきます。\n")
for (i = 1; i <= item; i++) {
part[i-1] = 9.99999
}
}
else {
for (i = 1; i <= item; i++) {
part[i-1] = -r[i][0]/Math.sqrt(r[0][0]*r[i][i])
}
}
printf("\n***** ノーマライズド スコア *****\n\nアイテム-カテゴリー カテゴリースコア 偏相関係数 t 値 P 値\n")
for (i = 0; i < item; i++) {
if (part[i] == 9.99999) {
partdf = partt = partp = 9.99999
}
else {
partdf = ncase-item-1
partt = Math.abs(part[i])*Math.sqrt(partdf/(1-part[i]*part[i]))
partp = txp(partt, partdf)
}
is = junjo[i]
ie = junjo[i]+cat[i]
l = 0
for (j = is; j < ie; j++) {
l++
if (l == 1) {
printf("\n%3i %8s %3s%22.7g%14.5f%14.5f%14.5f\n", j+1, vname(i), value[l-1][i], b[j], part[i], partt, partp)
}
else {
printf("%3i %3s%22.7g\n", j+1, value[l-1][i], b[j])
}
}
}
printf("\n 定数項%28.7g\n\n", cons)
printf("重相関係数 = %7.5f 決定係数(重相関係数の二乗)= %7.5f\n", rm, rr)
printf("\n***** 従属変数の観察値と予測値および残差 *****\n\nケース 観察値 予測値 残差\n")
for (i = 0; i < nc; i++) {
y = data[i][item]
pred = cons
for (j = 0; j < item; j++) {
pred += b[junjo[j]+data[i][j]-1]
}
printf("%6i%15.7g%15.7g%15.7g\n", i+1, y, pred, y-pred)
}
}
//-->
</script>
</head>
<body bgcolor="#ffffff">
<font size="+2"><b>数量化 I 類</b></font> <a href="src/qt1.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>
<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>
<td nowrap><img src="../gra/button3.png" width=9 height=9 alt="・"> <a href="exa/qt1.html">使用法</a></td>
</tr></table>
<p>
入力欄<br><textarea name="data" ROWS=20 COLS=80></textarea><p>
出力欄<br><textarea name="result" ROWS=30 COLS=80></textarea>
</form>
<p><hr noshade>
<img src="../gra/button3.png" width=9 height=9 alt="・"> <a href="../lecture/Qt/qt1.html">手法の解説</a><br>
<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><center><IMG SRC="../gra/ume5.png" width=121 height=37 ALT="Made with Macintosh"></center>
</body>
</html>
サブ txp.js Last modified: Mar 25, 2004
サブ inv.js Last modified: Mar 25, 2004
サブ io.js Last modified: Mar 25, 2004
直前のページへ戻る E-mail to Shigenobu AOKI