メイン 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

Made with Macintosh