[R]データの標準化を行う
scale関数を使う。ただし、この関数は変換の過程で分散ではなく不偏分散を使う。
以下のようなテキストファイルdata.txtがカレントディレクトリにあり、このデータの標準化を行ってみる。
1,165,53,86,56,92
2,160,47,84,52,92
3,166,55,86,64,89
4,164,56,90,60,95
5,168,55,87,56,87
6,164,54,87,57,92
7,168,54,94,58,97
8,169,55,88,57,92
9,169,53,86,58,93
10,166,56,84,57,90
テキストファイルを読み込んで、標準化を行う。
> dtf <- read.csv("data.txt", header = FALSE)
> mx <- unname(as.matrix(dtf[, -c(1)]))
> mx
[,1] [,2] [,3] [,4] [,5]
[1,] 165 53 86 56 92
[2,] 160 47 84 52 92
[3,] 166 55 86 64 89
[4,] 164 56 90 60 95
[5,] 168 55 87 56 87
[6,] 164 54 87 57 92
[7,] 168 54 94 58 97
[8,] 169 55 88 57 92
[9,] 169 53 86 58 93
[10,] 166 56 84 57 90
> scale(mx)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.32065694 -0.30578831 -0.40350226 -0.4895355 0.03513642
[2,] -2.10208440 -2.59920068 -1.07600602 -1.7949634 0.03513642
[3,] 0.03562855 0.45868247 -0.40350226 2.1213203 -1.01895613
[4,] -0.67694243 0.84091787 0.94150526 0.8158924 1.08922897
[5,] 0.74819953 0.45868247 -0.06725038 -0.4895355 -1.72168450
[6,] -0.67694243 0.07644708 -0.06725038 -0.1631785 0.03513642
[7,] 0.74819953 0.07644708 2.28651278 0.1631785 1.79195734
[8,] 1.10448502 0.45868247 0.26900150 -0.1631785 0.03513642
[9,] 1.10448502 -0.30578831 -0.40350226 0.1631785 0.38650060
[10,] 0.03562855 0.84091787 -1.07600602 -0.1631785 -0.66759195
attr(,"scaled:center")
[1] 165.9 53.8 87.2 57.5 91.9
attr(,"scaled:scale")
[1] 2.806738 2.616189 2.973961 3.064129 2.846050
不偏分散ではなく分散を使ってデータの標準化を行う場合は、自作の関数を作りapply関数を使う必要がある。以下は、分散の平方根(標準偏差)を求めるための自作関数std、分散を使うデータの標準化を行うための自作関数scaを作成し、それぞれを使用して計算した例。上の例を行い、行列mxに計算するための値が入っていることが前提。
> std <- function(d) sqrt(sum((d - mean(d)) ^ 2) / length(d))
> sca <- function(d) (d - mean(d)) / std(d)
> apply(mx, MARGIN = 2, sca)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.33800209 -0.3223292 -0.42532872 -0.5160157 0.03703704
[2,] -2.21579151 -2.7397981 -1.13420993 -1.8920575 0.03703704
[3,] 0.03755579 0.4834938 -0.42532872 2.2360680 -1.07407407
[4,] -0.71355998 0.8864053 0.99243369 0.8600261 1.14814815
[5,] 0.78867155 0.4834938 -0.07088812 -0.5160157 -1.81481481
[6,] -0.71355998 0.0805823 -0.07088812 -0.1720052 0.03703704
[7,] 0.78867155 0.0805823 2.41019610 0.1720052 1.88888889
[8,] 1.16422944 0.4834938 0.28355248 -0.1720052 0.03703704
[9,] 1.16422944 -0.3223292 -0.42532872 0.1720052 0.40740741
[10,] 0.03755579 0.8864053 -1.13420993 -0.1720052 -0.70370370

