例として,Rに組み込まれているcars
データを使う.
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
散布図はplot
に2つの変数ベクトルを投入する.3変数以上のデータフレームを投入すると,散布図マトリックスを出力する.
plot(cars$speed,cars$dist)
散布図に回帰直線を引く.
plot(cars$speed,cars$dist)
lm_cars<-lm(dist ~ speed, data=cars)
abline(coef=coef(lm_cars),col="red")
共分散,ただしcovはn-1で割る定義である.また,cov
にデータフレームを投入すると,分散共分散行列を出力する.
cov(cars$speed,cars$dist)
## [1] 109.9469
cov(cars)
## speed dist
## speed 27.95918 109.9469
## dist 109.94694 664.0608
nで割る共分散の関数を定義する.
cov_p<-function(x,y, na.rm = TRUE) {
if (!na.rm && any(c(is.na(x),is.na(y))))
return(NA_real_)
data<-data.frame(x=x,y=y)
data<-na.omit(data)
mx<-mean(data$x)
my<-mean(data$y)
n<-length(data$x)
sum((data$x-mx)*(data$y-my))/n
}
cov_cars<-cov_p(cars$speed,cars$dist)
cov_cars
## [1] 107.748
まずは,定義どおりに相関係数を計算しよう.そのために,nで割る標準偏差関数を定義する.
sd_p<-function(x, na.rm = TRUE) {
if (!na.rm && any(is.na(x)))
return(NA_real_)
x<-na.omit(x)
m<-mean(x)
n<-length(x)
sqrt(sum((x-m)^2)/n)
}
sd_speed<-sd_p(cars$speed)
sd_dist<-sd_p(cars$dist)
標準得点の共分散として相関係数を計算する.
mean(((cars$speed-mean(cars$speed))/sd_speed)*((cars$dist-mean(cars$dist))/sd_dist))
## [1] 0.8068949
共分散を標準偏差の積で除したものとして相関係数を計算する.
cov_cars/(sd_speed*sd_dist)
## [1] 0.8068949
R
上の関数cor
で計算しても値は変わらない.共分散・標準偏差の定義に1/nを使った場合でも,1/(n-1)の場合でも,相関係数の計算では,分母と分子でキャンセルされるからである.
cor(cars$speed,cars$dist)
## [1] 0.8068949
cov(cars$speed,cars$dist)/(sd(cars$speed)*sd(cars$dist))
## [1] 0.8068949
setosa種のデータだけを除く.
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
except_setosa_data<-subset(iris,Species!="setosa")[,-5]
pairs(except_setosa_data)
cov(except_setosa_data)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.4393495 0.12215758 0.4533616 0.16715960
## Sepal.Width 0.1221576 0.11072323 0.1427960 0.08002828
## Petal.Length 0.4533616 0.14279596 0.6815798 0.28873131
## Petal.Width 0.1671596 0.08002828 0.2887313 0.18042828
cor(except_setosa_data)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 0.5538548 0.8284787 0.5937094
## Sepal.Width 0.5538548 1.0000000 0.5198023 0.5662025
## Petal.Length 0.8284787 0.5198023 1.0000000 0.8233476
## Petal.Width 0.5937094 0.5662025 0.8233476 1.0000000