quantify_x_JPH {lazy.tree} | R Documentation |
この関数はカテゴリカルな説明変数の数値化を行う。
English help file: quantify_x
quantify_x( y, x, ux, loc, Y, method=1, remove_redundant=0 )
y |
基準変数ベクトル |
x |
カテゴリカルな説明変数 (as numeric) |
ux |
|
loc |
|
Y |
|
method |
カテゴリカルな説明変数の数量化の方法の指定 |
remove_redundant |
= 0 冗長な数値化された変数を取り除かない場合。 |
カテゴリカルな説明変数の場合
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 は基準変数の
水準数。)
詳細は以下の例を参照のこと。
基準変数の水準が少なめで、説明変数の水準数が多い場合には最適。
A list of:
ncatx
説明変数の水準数
ncaty
基準変数の水準数
newux
数量化された説明変数行列
candisc
= -2 method=4
の場合
= -1 数量化を行わなかった場合.
= 0 説明変数ごとの基準変数の条件付き平均を用いた場合
= 1 正準判別関数を用いた場合
# @keywords internal
# 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")