rによるlm関数を使わない回帰と梃子比・cookの距離

2
2011 5 月作成 lm 関数を使わない回帰分析と梃子比・Cook の距離 テストデータ作成 誤差項に自由度 10 t 分布乱数を用いた回帰モデルに従うデータを作成。n=1000lm 関数を使わない回帰分析と梃子比 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) # 回帰線入り

Upload: wada-kazumi

Post on 21-Jul-2015

826 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Rによるlm関数を使わない回帰と梃子比・cookの距離

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) # 回帰線入り

Page 2: Rによるlm関数を使わない回帰と梃子比・cookの距離

○ 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) # 回帰線入り