標本(サンプル)に対し,2つの変数 x,y が測定されているとする. たとえば,x が身長(m)であり,y が体重(kg)である. 大きさ n の標本(サンプル)に対し,2つの変数の組のデータが,
共分散は測定単位により大きさが変わるので,これをおのおのの変数の標本分散, Var[x],Var[y],
![]() |
![]() |
![]() |
![]() |
r <- read.csv("r1.csv") | # csv データ読み込み |
x <- r[,1]; y <- r[,2] | # |
plot(x,y, xlim=c(2,8), ylim=c(0,6)) | # x,y の散布図 |
title(main="相関係数 r = 0.23") | # |
cov(x, y) | # x と y の共分散 |
cor(x, y) | # x と y の相関係数 |
x <- 10*x | # |
plot(x,y, xlim=c(2,8), ylim=c(0,6)) | # x,y の散布図 |
cov(x, y) | # x と y の共分散 |
cor(x, y) | # x と y の相関係数 |
library(MASS) | # MASS ライブラリーの読み込み |
s <- matrix(c(100, 70, 70, 100), nrow=2) | # 分散共分散行列の定義 |
x <- mvrnorm(1000,c(50,50),s) | # 平均 50,分散 s の 2 変量正規分布乱数 1000 個生成 |
plot(x, xlab="入試得点", ylab="初年度成績") | # 分布全体を表示 |
points(x[x[,1]>54,], col="red") | # 入学者のみ赤で表示 |
abline(v=54) | # 合格ライン |
title(main="本来の相関と観測される相関") | # |
cor(x)[1,2] | # 本来あるべき相関 |
cor(x[x[,1]>54,])[1,2] | # 実際に観測される相関 |
データに最もよくあてはまる直線回帰式を得るには,データ点 (xi ,yi ), と回帰による推定点, (xi ,y^i ), y^i = a + b xi , の間の距離の2乗和 S が最小になるような回帰係数 a ,b を求める.つまり,
これは,S を a ,b で偏微分して 0 とおくことによって得られる.つまり,
入試得点(x) | 680 | 500 | 600 | 420 | 480 | 630 | 550 | 590 | 610 | 500 | 640 | 570 | 610 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
初年度成績(y) | 332 | 265 | 309 | 253 | 276 | 326 | 299 | 310 | 324 | 327 | 334 | 301 | 336 |
mba <- read.csv("mbagrade.csv"); mba # データ読み込み mbaf <- mba[mba[,1]=="F",] ; mbaf # 女子のみのデータ mbaf.lm <- lm(Grade1st ~ Entexam, data=mbaf) # 回帰:lm(y ~ x, data=zzz), y = ax + b summary(mbaf.lm) # 結果表示 plot(mbaf[,2:3], xlim=c(400,700), ylim=c(2.5,3.5), xlab="入試得点", ylab="初年度成績") # データ散布図 abline(mbaf.lm, col="blue") # 回帰直線表示 points(mbaf[,2], fitted(mbaf.lm), pch=19, col="red") # 回帰推定値 segments(mbaf[,2],mbaf[,3],mbaf[,2], fitted(mbaf.lm)) # 回帰残差 title(main="回帰直線と回帰残差") # legend(locator(1), legend=c("データ","回帰推定値"), pch=c(1,19), col=c("black","red")) |
推定された直線回帰式がどの程度現実のデータに適合しているかを調べるために, 回帰式が従う統計モデルを考える.標本の格データ点, (xi ,yi ), が,
回帰で説明がつかない残差平方和 Se は,
一般に,Var(yi ) = σ2 であるとき,その定数 倍の分散は,
目的変数 y が説明変数 x との回帰関係にないという 帰無仮説,
回帰係数 b の推定値 b^ の分散は,
回帰式により, 従属変数 y のデータ yi は,
データが直線回帰式でよく説明できるのは,回帰平方和が大きく,残差平方和 が小さい場合である.総平方和のうち回帰平方和で説明される割合を決定係数,もしくは 重相関係数の2乗といい,
変動因 | 平方和 | 自由度 | 平均平方 | F 値 |
---|---|---|---|---|
回帰 | SR | 1 | SR | F = SR/se2 |
残差 | Se | n-2 | se2 = Se/n-2 | |
全体 | ST | n-1 |
従属変数 y が説明変数 x の回帰関係にないという 帰無仮説,
anova(mbaf.lm) # 分散分析表 n <- nrow(mbaf); n # データ数 st <- var(mbaf[,3])*(n-1); st # 総平方和 sr <- var(fitted(mbaf.lm))*(n-1); sr # 回帰平方和 se <- var(resid(mbaf.lm))*(n-1); se # 残差平方和 s <- sqrt(se/(n-2)); s # 残差標準偏差 sx <- var(mbaf[,2])*(n-1); sx # x の総平方和 b <- cov(mbaf[,2],mbaf[,3])*(n-1)/sx; b # 回帰係数 sb <- s/sqrt(sx); sb # 回帰係数bの標準誤差 r2 <- sr/st; r2 # 重相関係数の2乗 r <- cor(mbaf[,3], fitted(mbaf.lm)); r # 目的変数と回帰推定値の相関 fv <- sr/(se/(n-2)); fv # F値 tv <- b/sb; tv # t値 |
回帰係数の標準誤差 s b を用いて, 回帰係数 b の信頼区間がつくれる.すなわち, 自由度 n-2 の t 分布の 97.5%点を t0 とすると, 回帰係数 b の 95%信頼区間の幅 d は,d = t0 s b となるので, 95%信頼区間は,
new <- data.frame(Entexam=seq(400,700,by=2)) # 予測したい範囲の定義 Grac <- predict(mbaf.lm, new, interval="confidence", level=0.95) # 回帰推定値(回帰直線)の 95 %信頼幅 Grap <- predict(mbaf.lm, new, interval="prediction", level=0.95) # 回帰予測値の 95 %信頼幅 matplot(new$Entexam, cbind(Grac,Grap[,-1]), lty=c(1,2,2,3,3), type="l", col=c("blue","blue","blue","red","red"), xlab="入試得点", ylab="初年度成績") points(mbaf[,2:3]) # データの表示 title(main="回帰式と予測値の 95 %信頼幅") # |
# 信頼幅を詳しく計算 |
n <- nrow(mbaf); n # データ数 sx <- var(mbaf$Entexam)*(n-1); sx # x の偏差平方和 se <- summary(mbaf.lm)$sigma; se # 残差標準偏差 b <- coef(mbaf.lm)[2]; b # 回帰係数 mx <- mean(mbaf$Entexam) # x の平均 my <- mean(mbaf$Grade1st) # y の平均 t0 <- qt(0.975, df=(n-2)); t0 # 自由度 n - 2 の t 分布 97.5%点 x11() # 新しいグラフウィンドウで表示 plot(mbaf[,2:3], xlim=c(400,700), ylim=c(2,4)) # データ散布図 abline(mbaf.lm, col="blue") # 回帰直線 sr <- 1/n + (new$Entexam-mx)^2/sx # y1 <- my + b*(new$Entexam-mx) + t0*se*sqrt(sr) # 回帰直線 95%信頼幅上限 y2 <- my + b*(new$Entexam-mx) - t0*se*sqrt(sr) # 回帰直線 95%信頼幅下限 points(new$Entexam, y1, type="l", lty=2, col="blue") # points(new$Entexam, y2, type="l", lty=2, col="blue") # yp1 <- my + b*(new$Entexam-mx) + t0*se*sqrt(sr+1) # 回帰予測値 95%信頼幅上限 yp2 <- my + b*(new$Entexam-mx) - t0*se*sqrt(sr+1) # 回帰予測値 95%信頼幅下限 points(new$Entexam, yp1, type="l", lty=3, col="red") # points(new$Entexam, yp2, type="l", lty=3, col="red") # title(main="回帰式と予測値の 95 %信頼幅") |
![]() |
![]() |
![]() |
![]() |
mba <- read.csv("mbagrade.csv") # データ読み込み mbaf <- mba[mba[,1]=="F",] # 女性データのみ抽出 mbaf.lm <- lm(Grade1st ~ Entexam, data=mbaf) # 回帰 summary(mbaf.lm) # 結果表示 plot(mbaf.lm) # 回帰診断はたったこれだけ.(4枚のグラフが出てくる) # # 回帰診断を詳しくみる # てこ比 lev <- hatvalues(mbaf.lm); lev # てこ比 X <- model.matrix(mbaf.lm) # 説明変数行列 H <- X %*% solve(t(X) %*% X) %*% t(X) # ハット行列 diag(H) # てこ比の計算による導出 # 標準化残差 rstd <- rstandard(mbaf.lm); rstd # 標準化残差 se <- summary(mbaf.lm)$sigma # 残差標準偏差 resid(mbaf.lm)/(se*sqrt(1-lev)) # 標準化残差の計算による導出 # Cook 距離 cookd <- cooks.distance(mbaf.lm); cookd # Cook 距離 b <- coef(mbaf.lm); b # 回帰係数 lm1 <- lm(Grade1st[-1] ~ Entexam[-1], data=mbaf) b1 <- coef(lm1); b1 # 1番目のデータを除いた回帰係数 t(b-b1) %*% t(X) %*% X %*% (b-b1)/se^2/2 # 1番目のデータの Cook 距離 rstd^2*lev/(1-lev)/2 # Cook 距離の計算による導出 # 回帰推定値 - 残差プロット x0 <- fitted(mbaf.lm) # 回帰推定値 y0 <- resid(mbaf.lm) # 回帰残差 plot(x0, y0, type="n", xlab="回帰推定値", ylab="残差") # text(x0, y0, rownames(mbaf), cex=0.8) abline(h=0, lty=3) title(main="回帰推定値 - 残差プロット") # 標準化残差 Q - Q プロット a <- qqnorm(rstd, type="n", main="") # 標準化残差の Q - Q プロット(正規分布からのずれ) text(a, rownames(mbaf), cex=0.8) qqline(rstd, col="red") title("標準化残差正規 Q-Q プロット") # S - L プロット yr <- sqrt(abs(rstd)) # 標準化残差絶対値の平方根 plot(x0, yr, type="n", xlab="回帰推定値", ylab="残差絶対値の平方根") # text(x0, yr, rownames(mbaf), cex=0.8) title(main="S - L プロット") # てこ比 - 標準化残差 プロット plot(lev, rstd, type="n", xlim=c(0,0.5), xlab="てこ比", ylab="標準化残差") text(lev, rstd, rownames(mbaf), cex=0.8) abline(h=0, lty=3) abline(v=0, lty=3) title(main="てこ比 - 標準化残差 プロット") xx <- seq(0, 0.5, by=0.01) yc <- .5*2*(1-xx)/xx # Cook 距離 0.5 となる標準化残差 yc1 <- sqrt(yc) yc2 <- -yc1 points(xx, yc1, type="l", lty=2, col="red") # Cook 距離 0.5 線 points(xx, -yc1, type="l", lty=2, col="red") |
mba <- read.csv("mbagrade.csv") # データ読み込み nf <- which(mba[,1]=="F") # 女子データの番号 mba.lm <- lm(Grade1st ~ Sex + Entexam, data=mba) # 重回帰分析 summary(mba.lm) # 結果表示 anova(mba.lm) # 分散分析表示 # # グラフ表示 plot(mba[,2:3], type="n", xlim=c(400,750), xlab="入試得点", ylab="初年度成績") # points(mba[-nf,2:3], pch=21) # 男子データ(白丸) points(mba[nf,2:3], pch=19) # 女子データ(黒丸) b <- coef(mba.lm) # 回帰係数 x <- seq(400,750,by=1) # ym <- b[1] + b[2] + b[3]*x # 男子回帰式 yf <- b[1] + b[3]*x # 女子回帰式 lines(x, ym, type="l", col="blue") # lines(x, yf, type="l", col="red") # legend(locator(1), c("男子","女子"), pch=c(21,19)) # title(main="MBA 入試得点と初年度成績") # |
mba2.lm <- lm(Grade1st ~ Sex + Sex:Entexam, data=mba) # 重回帰分析 summary(mba2.lm) # 結果表示 anova(mba2.lm) # plot(mba[,2:3], type="n", xlim=c(400,750), xlab="入試得点", ylab="初年度成績") # points(mba[-nf,2:3], pch=21) # 男子データ(白丸) points(mba[nf,2:3], pch=19) # 女子データ(黒丸) b <- coef(mba2.lm) # 回帰係数 x <- seq(400,750,by=1) # ym <- b[1] + b[2] + b[4]*x # 男子回帰式 yf <- b[1] + b[3]*x # 女子回帰式 lines(x, ym, type="l", col="blue") # lines(x, yf, type="l", col="red") # legend(locator(1), c("男子","女子"), pch=c(21,19)) # title(main="MBA 入試得点と初年度成績") # # |
k 個のパラメータ θ を持つ回帰モデル
anova(mba.lm) | # 性別,入試得点重回帰の分散分析表 |
AIC(mba.lm) | # 性別,入試得点重回帰モデルの AIC |
n <- nrow(mba) | # 総データ数 |
v2 <- anova(mba.lm)[3,2]/n | # 残差分散の最尤推定値(n で割る) |
aic <- n*log(2*pi) + n*log(v2) + n + 2*4; aic | # 自由パラメータ数 4 の AIC |
anova(mba2.lm) | # 男女別々回帰,残差分散共通の分散分析表 |
AIC(mba.lm) | # 男女別々回帰,残差分散共通モデルの AIC |
anova(mbaf.lm) | # 男子単回帰分散分析表 |
anova(mbam.lm) | # 女子単回帰分散分析表 |
AIC(mbaf.lm)+AIC(mbam.lm) | # 男女完全別々モデルの AIC |
kion <- read.csv("kion.csv") | # 気温データ読み込み |
pairs(kion[,2:5]) | # 変数間散布図一覧 |
cor(kion[,2:5]) | # 変数間相関 |
kion1.lm <- lm(気温 ~ 緯度 + 経度 + 標高, data=kion) | # 3 変数重回帰 |
summary(kion1.lm) | # 結果表示 |
anova(kion1.lm) | # 分散分析表示 |
n <- nrow(kion) | # データ数 |
x0 <- rep(1,n) | # |
x <- as.matrix(cbind(x0, kion[,3:5])) | # 説明変数行列 |
se2 <- anova(kion1.lm)[4,3] | # 残差分散 |
v <- se2 * solve(t(x) %*% x) | # 回帰係数の分散共分散行列 |
sqrt(diag(v)) | # 回帰係数の標準誤差 |
kion0.lm <- lm(気温 ~ 1, data=kion) | # 説明変数無し回帰 |
anova(kion0.lm) | # |
kion11.lm <- lm(気温 ~ 緯度, data=kion) | # 説明変数:緯度,回帰 |
anova(kion11.lm) | # |
kion12.lm <- lm(気温 ~ 経度, data=kion) | # 説明変数:経度,回帰 |
anova(kion12.lm) | # |
kion13.lm <- lm(気温 ~ 標高, data=kion) | # 説明変数:標高,回帰 |
anova(kion13.lm) | # |
kion21.lm <- lm(気温 ~ 緯度 + 経度, data=kion) | # 説明変数:緯度,経度,回帰 |
anova(kion21.lm) | # |
kion22.lm <- lm(気温 ~ 経度 + 標高, data=kion) | # 説明変数:経度,標高,回帰 |
anova(kion22.lm) | # |
kion23.lm <- lm(気温 ~ 緯度 + 標高, data=kion) | # 説明変数:緯度,標高,回帰 |
anova(kion23.lm) | # |
kion3.lm <- lm(気温 ~ 緯度 + 経度 + 標高, data=kion) | # 説明変数:緯度,経度,標高,回帰 |
anova(kion3.lm) | # |
AIC(kion0.lm) | # 説明変数無し回帰 AIC |
AIC(kion11.lm) | # 説明変数:緯度,回帰 AIC |
AIC(kion12.lm) | # 説明変数:経度,回帰 AIC |
AIC(kion13.lm) | # 説明変数:標高,回帰 AIC |
AIC(kion21.lm) | # 説明変数:緯度,経度,回帰 AIC |
AIC(kion22.lm) | # 説明変数:経度,標高,回帰 AIC |
AIC(kion23.lm) | # 説明変数:緯度,標高,回帰 AIC |
AIC(kion3.lm) | # 説明変数:緯度,経度,標高,回帰 AIC |
library(MASS) | # MASS ライブラリィー読み込み |
null <- lm(気温 ~ 1, kion) | # 説明変数無し |
full <- lm(気温 ~ 緯度 + 経度 + 標高, kion) | # 説明変数3つ |
result <- stepAIC(null, scope=list(lower=null, upper=full), data=kion) | # 変数増減法 |
summary(result) | # 結果表示 |
cars | # R 付属データ 'cars' の呼び出し |
plot(cars, xlim=c(0,30), xlab="速度", ylab="制動距離") | # cars の散布図 |
title(main="制動距離に対する速度の多項式回帰") | # |
y <- cars$dist | # 目的変数(制動距離) |
x <- cars$speed | # 説明変数(速度) |
car1.lm <- lm(y ~ x) | # 1次回帰 |
abline(car1.lm, lty=3, col="red") | # 赤点線で表示 |
summary(car1.lm) | # |
car10.lm <- lm(y ~ 0 + x) | # 原点を通る1次回帰 |
abline(car10.lm, col="red") | # 赤実線で表示 |
summary(car10.lm) | # |
x2 <- x^2 | # x の2乗を新しい変数で定義 |
car2.lm <- lm(y ~ x + x2) | # 重回帰(2次式回帰) |
b <- car2.lm$coefficients | # 回帰係数 |
xv <- seq(0, 30, by=0.2) | # x の点列の定義 |
yv <- b[1] + b[2]*xv + b[3]*xv^2 | # x の点列に対する2次回帰推定値 |
lines(xv, yv, lty=3, col="blue") | # 青点線で表示 |
summary(car2.lm) | # |
car20.lm <- lm(y ~ 0 + x + x2) | # 原点を通る2次式回帰 |
b <- car20.lm$coefficients | # 回帰係数 |
yv <- b[1]*xv + b[2]*xv^2 | # x の点列に対する2次回帰推定値 |
lines(xv, yv, col="blue") | # 青実線で表示 |
summary(car20.lm) | # |
x3 <- x^3 | # x の3乗を新しい変数で定義 |
car3.lm <- lm(y ~ x + x2 + x3) | # 3変数重回帰(3次式回帰) |
b <- car3.lm$coefficients | # 回帰係数 |
yv <- b[1] + b[2]*xv + b[3]*xv^2 + b[4}*xv^3 | # x の点列に対する3次回帰推定値 |
lines(xv, yv, lty=3, col="green") | # 緑点線で表示 |
summary(car3.lm) | # |
car30.lm <- lm(y ~ 0 + x + x2 + x3) | # |
b <- car30.lm$coefficients | # 回帰係数 |
yv <- b[1]*xv + b[2]*xv^2 + b[3]*xv^3 | # x の点列に対する3次回帰推定値 |
lines(xv, yv, col="green") | # 緑実線で表示 |
summary(car30.lm) | # |
AIC(car1.lm) | # 1次回帰の AIC |
AIC(car10.lm) | # 原点を通る1次回帰の AIC |
AIC(car2.lm) | # 2次式回帰の AIC |
AIC(car20.lm) | # 原点を通る2次式回帰の AIC |
AIC(car3.lm) | # 3次式回帰の AIC |
AIC(car30.lm) | # 原点を通る3次式回帰の AIC |