rによるlm関数を使わない回帰と梃子比・cookの距離
TRANSCRIPT
2011 年 5 月作成
lm 関数を使わない回帰分析と梃子比・Cook の距離
○ テストデータ作成
誤差項に自由度 10 の t 分布乱数を用いた回帰モデルに従うデータを作成。n=1000。
○ lm 関数を使わない回帰分析と梃子比
x の先頭に要素が全て 1 の列を加えて行列計算を行う。逆行列が計算できれば回帰分析
は可能。hat 行列(ここでは hat1)の対角成分が梃子比となるが、hat 行列は説明変数の
みから算出されており、梃子比は単に説明変数の平均からの近さで決まる。
rm(list=ls(all=TRUE)) # 作業領域のクリア
setwd("d:/TSR2/sim") # データファイルなどを置く作業ディレクトリの指定
library(sn) # for rmst (t 分布に従う乱数を発生させる関数)
set.seed(24) # 乱数を固定するためのシード設定
a1 <- 2 # 回帰パラメータの傾きを指定
b1 <- 5 # 回帰パラメータ切片
x <- runif(1000, min=1, max=10) # 説明変数は一様乱数
y <- a1 * x + b1 + rt(1000, df= 10)
# 被説明変数は回帰モデルに従い自由度 10 の t 分布乱数残差を持つ
x1 <- cbind(rep(1, 1000), x) # x の先頭に全て 1 の列を加える
hat1 <- x1 %*% solve((t(x1) %*% x1)) %*% t(x1) # hat 行列の計算
teko<- diag(hat1)
(bt1 <- solve(t(x1) %*% x1) %*% t(x1) %*% y) # 回帰係数算出
res1 <- y - hat1 %*% y # 残差
summary(res1) # 残差の四分位値を含む基本統計量算出
s2 <- sum(res1^2) / (nrow(x1) - ncol(x1)) # 誤差項の不偏分散推定量
sqrt(s2) # 誤差項の標準偏差
(se1 <- (diag(s2*solve(t(x1)%*%x1)))^0.5) # 回帰パラメータの標準誤差
##### t 検定
(t1 <- bt1 / se1) # t 値
2 * pt(-abs(t1), nrow(x1) - ncol(x1)) # 両側 t 検定の p 値
(R2 <- 1- sum(res1^2)/(sum((y-mean(y))^2))) # 決定係数
(R2r<- 1- sum(res1^2) / (sum((y-mean(y))^2))*(nrow(x1)-1)
/ (nrow(x1)-ncol(x1))) # 自由度調整済み決定係数
##### F 検定 (切片以外がゼロであるを検定する F 統計値の計算)
(f1 <-R2/(1-R2)*(nrow(x1)-ncol(x1))/(ncol(x1)-1))
1-pf(f1,ncol(x1)-1,nrow(x1)-ncol(x1)) # F 検定の p 値の計算
summary(lm(y~x)) # lm 関数の結果と比較してみる
flg<- rep(1, 1000)
flg[which(teko>boxplot(teko)$stats[3])] <- 2 # 中位数
flg[which(teko>boxplot(teko)$stats[4])] <- 3 # 四分位値
flg[which(teko== boxplot(teko)$stats[5])] <- 4 # 最大値のデータ
plot(x, y, col=c("black", "yellow", "orange", "red")[flg], pch=20)
abline(lm1, col="blue", lwd=2) # 回帰線入り
○ Cook の距離
Cook の距離は全てのデータを用いた際と、1つのデータを除いた場合の回帰式による予測値の差に関する距離尺度。Cook の距離が大きいデータは、回帰式に与える影響が大きく、異常値である可能性がある。 一般に、Cook の距離が 0.5 以上であれば大きいとされる。
R では関数 cooks.distance を用いて算出することができる。
梃子比 Cook の距離
2 4 6 8 10
51
01
52
02
5
x
y
2 4 6 8 10
51
01
52
02
5
x
y
cd1 <- cooks.distance(lm1) # Cook の距離算出
flg2<- rep(1, 1000) # 色分け用のフラグ
flg2[which(cd1 >= 0.0003)] <- 2 # 適当に大きな数字に色をつける
flg2[which(cd1 >= 0.001)] <- 3
plot(x, y, col=c("black","orange","red")[flg2], pch=20)
abline(lm1, col="blue", lwd=2) # 回帰線入り