quantify_x_JPH {lazy.tree}R Documentation

カテゴリカルな説明変数の数値化

Description

この関数はカテゴリカルな説明変数の数値化を行う。
English help file: quantify_x

Usage

quantify_x( y, x, ux, loc, Y, method=1, remove_redundant=0 )

Arguments

y

基準変数ベクトル

x

カテゴリカルな説明変数 (as numeric)

ux

x のユニークな値

loc

x のユニークな値の x における位置

Y

method=4 における基準変数の水準の組み合わせ

method

カテゴリカルな説明変数の数量化の方法の指定
= 0 説明変数のダミー展開,
= 1 第1正準変数のみを利用,
= 2 第2正準変数が存在する場合には, それに加えてと、 第1変数との和と差を利用
= 3 method=2 の結果に加えて、基準変数の各水準を one-versus-rest で2値化し そレらの説明変数の各水準ごとの条件付き平均を用いる。
= 4 基準変数の水準の二つのサブセットへの分割をもとに 基準変数を2値化し、説明変数の水準ごとの条件付き平均を用いる。

remove_redundant

= 0 冗長な数値化された変数を取り除かない場合。

Details

カテゴリカルな説明変数の場合
app=0 の場合:
水準数が 2 以上のカテゴリカルな説明変数は、 method の指定に 従って数値化される。

もしも基準変数が数値的か2水準のカテゴリカルな場合には 説明変数の各水準ごとに基準変数の条件付き平均を計算し、その値を 数値化された説明変数の値とする。(以下の全ての method の指定でも同様)

method=0: 基準変数の水準数が 3 以上の場合には、基準変数と 説明変数を one-hot なダミー変数に展開したものを数値化された説明変数とする。
(数値化された説明変数の数 = 説明変数の水準の数)

method=1: 基準変数の水準数が 3 以上の場合には、基準変数と 説明変数を one-hot なダミー変数に展開したものとの間で正準判別分析を行い 計算された第1正準変数 cv1 を数値化された説明変数の値とする。
(数値化された説明変数の数 = 1)

method=2: もしも第2正準変数 cv2 が計算可能な場合には上記の cv1 に 加えて cv2 と cv1+cv2, cv1-cv2 の全部で 4 つの値を 数値化された説明変数の値とする。 cv2 が計算できない場合には method=1 と同じ。
(数値化された説明変数の数 = 4 or 1)

method=3: 基準変数の各水準に関して 基準変数を one-versus-rest という形で2値化したものを用いて 説明変数の各水準ごとに基準変数の条件付き平均を計算したものを用いる。 ただし、分散が 0 になたっり他の変数と同一の値になる場合は除く。
(数値化された説明変数の数 = 基準変数の水準数)

If method=4:基準変数の水準を二つのサブセットへの分割をもとに 基準変数を2値化し、説明変数の水準ごとにそれらの条件付き平均を 計算したものを用いる。 ただし、分散が 0 になたっり他の変数と同一の値になる場合は除く。
(数値化された説明変数の数 = 2^nc-1-1、ただし、 nc は基準変数の 水準数。)
詳細は以下の例を参照のこと。

基準変数の水準が少なめで、説明変数の水準数が多い場合には最適。

Value

A list of:
ncatx 説明変数の水準数
ncaty 基準変数の水準数
newux 数量化された説明変数行列
candisc = -2 method=4 の場合
= -1 数量化を行わなかった場合.
= 0 説明変数ごとの基準変数の条件付き平均を用いた場合
= 1 正準判別関数を用いた場合

# @keywords internal

Examples

# iris: categorical y, categorical X
Species <- iris$Species
levels(Species) <- c("set","ver","vir")
Xc <- iris[,-5]
Xc[,3] <- cut(Xc[,3],9, labels=1:9)
Xc[,4] <- cut(Xc[,4],9, labels=1:9)

y <- Species
x <- as.numeric(Xc[,3])
temp <- Unique(x)
ux <- temp$value
loc <- temp$loc

q1 <- quantify_x( y, x, ux, loc, method=1 )$newux
q2 <- quantify_x( y, x, ux, loc, method=2 )$newux

Print(q1,q2, fmt="5.2")


# 方法の説明
#
# x と y の生成
y <- as.factor( LETTERS[c(1,2,3,   1,2,4,   2,3,4,   2,4,4,3,   2,4)] )
# 説明変数 x はカテゴリカルでも数値として生成する。
x <- c(1, 1, 1,   2, 2, 2,   3, 3, 3,   4, 4, 4, 4,   5, 5)

# y の水準数等
ncaty <- length(unique(y))
n <- length(y)

# x のユニークな値とその場所
temp <- Unique(x)
ux <- temp$value
loc <- temp$loc

# method 1 and 2
q1 <- quantify_x( y, x, ux, loc, method=1 )$newux
q2 <- quantify_x( y, x, ux, loc, method=2 )$newux

Print(ux,q1,q2, fmt="6.3")

# 冗長性のチェックのためにランクへ変換する
q1 <- t(unique(t(apply( round(q1,3), 2, rank, ties.method="min" ))))
q2 <- t(unique(t(apply( round(q2,3), 2, rank, ties.method="min" ))))

Print(ux,q1,q2, fmt="6.1")


# method=3 と method=4 の詳細
#
# 以下の例の Y の生成は実際には DecTree 関数で行われる。
# また、ランクへの変換は Divide 関数で行われる。
#
# 1) 全ての y の水準の2分割を示す Y 行列の生成
id <- gen01pat( ncaty, sort=-2, partition=1 ) == 1  # logical matrix
npart <- nrow(id)
uy <- unique(y)
Y <- matrix(0,n,npart)
for(k in 1:npart ){
 Y[,k] <- y %in% uy[id[k,]]
}
colnames(Y) <- paste("qx",1:ncol(Y), sep="")
cat("\nThe Y[,j]=1 の部分とそうでない部分で2分割する。\n")
printm(y,Y, x)

# 2) x の値ごとに、Y 行列の各列の条件付き平均を計算する。
uxnew <- matrix(0,length(ux),ncol(Y))
for( i in 1:length(ux) ){
 uxnew[i,] <- colMeans(Y[loc[[i]],,drop=0])
}
# 分散が 0 となったり、同一の列が存在する場合は、それらの列を除く。
colnames(uxnew) <- paste("qx",1:ncol(uxnew), sep="")
rownames(uxnew) <- paste("x",1:nrow(uxnew), sep="")
Print(ux, uxnew)

# 上記の条件付平均を quantify_x で計算する(冗長な列は省く)
q3 <- quantify_x( y, x, ux, loc, Y[,1:ncaty], method=3 )$newux
q4 <- quantify_x( y, x, ux, loc, Y, method=4 )$newux
Print(ux,q3,q4, fmt="5.2")

# ランクへの変換
q3 <- t(unique(t(apply( q3, 2, rank, ties.method="min" ))))
q4 <- t(unique(t(apply( q4, 2, rank, ties.method="min" ))))
Print(ux,q3,q4, fmt="4.0")





[Package lazy.tree version 0.1.5 ]