数量化 IV 類     Last modified: Sep 01, 2009

目的

数量化 IV 類による分析を行う

使用法

qt4(s)
print.qt4(obj, ax=res$ax, digits=5)
plot.qt4(obj, text.cex=0.7, ...)

引数

s         類似度行列(正方行列,対称行列でなくてもよい)
ax        出力する次元数
digits    結果の出力桁数
text.cex  ラベルのフォントの大きさ
...        plot への引数

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/qt4.R", encoding="euc-jp")

# 数量化 IV 類
qt4 <- function(s)                                   # 類似度行列
{
        if (is.data.frame(s)) {
                s <- as.matrix(s)
        }
        n <- nrow(s)                                 # 行列のサイズ
        object.names <- colnames(s)
        if (is.null(object.names)) {
                object.names <- paste("対象", 1:n, sep="")
        }
        h <- s+t(s)                                  # 転置行列との和を計算して,
        diag(h) <- 0                                 # 対角要素を 0 にする
        diag(h) <- -rowSums(h)                               # 行和を求めて新たな対角要素とする
        res <- eigen(h)                                      # 固有値固有ベクトルを求める
        values <- res$values[res$values > 1e-5]              # 固有値が 0.00001 以上のものを解とする
        ax <- length(values)                         # 解の個数
        vectors <- res$vectors[,1:ax]                        # 固有ベクトル
        colnames(vectors) <- names(values) <- paste("解", 1:ax, sep="") # 名前を付ける
        rownames(vectors) <- object.names            # 名前を付ける
        return(structure(list(ax=ax, n=n, values=values, vectors=vectors), class="qt4"))
}
# print メソッド
print.qt4 <- function(       res,                            # princo が返すオブジェクト
                        ax=res$ax,                      # 何次元までの解を出力するか
                        digits=5)                       # 表示桁数
{
        ax <- min(ax, res$ax)
        val <- res$values
        val2 <- val/sum(val)
        val <- rbind(val, val2, cumsum(val2))
        rownames(val) <- c("固有値", "寄与率", "累積寄与率")
        print(round(val[, 1:ax], digits=digits))
        cat("\nベクトル\n\n")
        print(round(res$vectors[, 1:ax], digits=digits))
}
# plot メソッド
plot.qt4 <- function(        res,                            # princo が返すオブジェクト
                        text.cex=0.7,                   # ラベルのフォントの大きさ
                        ...)                            # plot への引数
{
        if (res$ax >= 2) {                              # 二次元以上の解が得られたら,
                plot(res$vectors[,1:2], ...)            # 二次元の図を描く
                abline(v=0, h=0)
                old <- par(xpd=TRUE)
                text(res$vectors[,1], res$vectors[,2], rownames(res$vectors), pos=4, offset=.2, cex=text.cex)
                par(old)
        }
        else {
                warning("解が一次元なので,二次元配置図は描けません。")
        }
}


使用例

> s <- matrix(c(	# 4行4列の類似度行列例(ファイルから読んでも良い)
	0, -3, -5, -1,
	-1, 0, -2, -3,
	-2, -3, 0, -2,
	-3, -4, -1, 0
), byrow=TRUE, ncol=4)

> ( a <- qt4(s) )
                解1      解2      解3
固有値     23.14960 21.17475 15.67565
寄与率      0.38583  0.35291  0.26126
累積寄与率  0.38583  0.73874  1.00000

ベクトル

           解1      解2      解3
対象1 -0.38519  0.62299 -0.46206
対象2 -0.60147 -0.52910  0.32907
対象3  0.53280 -0.45162 -0.51202
対象4  0.45386  0.35773  0.64501

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/similarity.matrix.R", encoding="euc-jp")

# データ行列から類似度行列を作る
similarity.matrix <- function(       dat,                            # データ行列
                                power=1,                        # 距離のべき乗数(ユークリッド二乗距離なら 2 を指定)
                                ...)                            # dist 関数への引数(距離の種類などの指定)
{
        d <- as.matrix(dist(dat, ...))
        if (power != 1) {
                d <- d^power
        }
        d <- -d
        diag(d) <- 0
        return(d)
}


# plot メソッドでグラフ表示する

> a <- similarity.matrix(iris[1:4], method="minkowski")
> b <- qt4(a)
> plot(b, col=(1:3)[as.integer(iris[,5])])
> plot(b, col=(1:3)[as.integer(iris[,5])], xlim=c(-0.025, 0.1), ylim=c(-0.03, 0.0), cex=0.6)

     全体
fig
     中心部拡大
fig
・ 解説ページ


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh