標本(サンプル)に対し,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("mbagrade2.csv") | # データ読み込み |
| mbaf <- mba[mba[,1]=="F",] | # 女性データのみ抽出 |
| mbaf.lm <- lm(初年度成績 ~ 入試得点, 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)) | # データ散布図 |
| abline(mbaf.lm, col="blue") | # 回帰直線 |
| points(mbaf[,2], mbaf.lm$fitted.value, pch=19, col="red") | # 回帰推定値 |
| segments(mbaf[,2],mbaf[,3],mbaf[,2], mbaf.lm$fitted.value) | # 回帰残差 |
| 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(mbaf.lm$fitted.values)*(n-1); sr | # 回帰平方和 |
| se <- var(mbaf.lm$residuals)*(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], mbaf.lm$fitted.values); 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%信頼区間は,

| x <- mbaf[,2] | # 入試得点 |
| y <- mbaf[,3] | # 初年度成績 |
| d <- lm(y ~ x) | # 回帰モデル |
| new <- data.frame(x=seq(400,700,by=2)) | # 予測したい範囲の定義 |
| dc <- predict(d, new, interval="confidence", level=0.95) | # 回帰推定値(回帰直線)の 95 %信頼幅 |
| dp <- predict(d, new, interval="prediction", level=0.95) | # 回帰予測値の 95 %信頼幅 |
| matplot(new$x, cbind(dc,dp[,-1]), lty=c(1,2,2,3,3), type="l", col=c("blue","blue","blue","red","red"), xlab="入試得点", ylab="初年度成績") | |
| points(x, y) | # データの表示 |
| title(main="回帰式と予測値の 95 %信頼幅") | # |
| # 信頼幅を詳しく計算 | |
| n <- nrow(mbaf); n | # データ数 |
| sx <- var(x)*(n-1); sx | # x の偏差平方和 |
| se <- summary(d)$sigma; se | # 残差標準偏差 |
| b <- d$coefficients[2]; b | # 回帰係数 |
| mx <- mean(x) | # x の平均 |
| my <- mean(y) | # y の平均 |
| t0 <- qt(0.975, df=(n-2)); t0 | # 自由度 n - 2 の t 分布 97.5%点 |
| plot(x, y, xlim=c(400,700), ylim=c(2,4)) | # データ散布図 |
| abline(d, col="blue") | # 回帰直線 |
| sr <- 1/n + (new$x-mx)^2/sx | # |
| y1 <- my + b*(new$x-mx) + t0*se*sqrt(sr) | # 回帰直線 95%信頼幅上限 |
| y2 <- my + b*(new$x-mx) - t0*se*sqrt(sr) | # 回帰直線 95%信頼幅下限 |
| points(new$x, y1, type="l", lty=2, col="blue") | # |
| points(new$x, y2, type="l", lty=2, col="blue") | # |
| yp1 <- my + b*(new$x-mx) + t0*se*sqrt(sr+1) | # 回帰予測値 95%信頼幅上限 |
| yp2 <- my + b*(new$x-mx) - t0*se*sqrt(sr+1) | # 回帰予測値 95%信頼幅下限 |
| points(new$x, yp1, type="l", lty=3, col="red") | # |
| points(new$x, yp2, type="l", lty=3, col="red") | # |
| title(main="回帰式と予測値の 95 %信頼幅") | # |




![]() |
![]() |
![]() |
![]() |
mba <- read.csv("mbagrade2.csv") # データ読み込み
mbaf <- mba[mba[,1]=="F",] # 女性データのみ抽出
mbaf.lm <- lm(初年度成績 ~ 入試得点, data=mbaf) #
summary(mbaf.lm) # 結果表示
plot(mbaf[,2:3], type="n", xlim=c(400,700), ylim=c(2.5,3.5)) # データ散布図
text(mbaf[,2:3], rownames(mbaf)) # データ番号表示
abline(mbaf.lm, col="blue") # 回帰直線
x11() # 新しいグラフウィンドウ
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 # 残差標準偏差
mbaf.lm$residuals/(se*sqrt(1-lev)) # 標準化残差の計算による導出
# Cook 距離
x <- mbaf$入試得点
y <- mbaf$初年度成績
cookd <- cooks.distance(mbaf.lm); cookd # Cook 距離
b <- mbaf.lm$coefficients; b # 回帰係数
lm1 <- lm(y[-1] ~ x[-1])
b1 <- lm1$coefficients; b1 # 1番目のデータを除いた回帰係数
t(b-b1) %*% t(X) %*% X %*% (b-b1)/se^2/2 # 1番目のデータの Cook 距離
rstd^2*lev/(1-lev)/2 # Cook 距離の計算による導出
# 回帰推定値 - 残差プロット
x0 <- mbaf.lm$fitted.values # 回帰推定値
y0 <- mbaf.lm$residuals # 回帰残差
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("mbagrade2.csv") | # データ読み込み |
| mbaf <- mba[mba[,1]=="F",] | # 女子データ |
| mbam <- mba[mba[,1]=="M",] | # 男子データ |
| mba.lm <- lm(初年度成績 ~ 性別 + 入試得点, data=mba) | # 重回帰分析 |
| summary(mba.lm) | # 結果表示 |
| plot(mba[,2:3], type="n", xlim=c(400,750)) | # |
| points(mbam[,2:3], pch=21) | # 男子データ(白丸) |
| points(mbaf[,2:3], pch=19) | # 女子データ(黒丸) |
| b <- mba.lm$coefficients | # 回帰係数 |
| 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 入試得点と初年度成績") | # |
| mbaf.lm <- lm(初年度成績 ~ 入試得点, data=mbaf) | # 女子回帰 |
| summary(mbaf.lm) | # 結果表示 |
| mbam.lm <- lm(初年度成績 ~ 入試得点, data=mbam) | # 男子回帰 |
| summary(mbam.lm) | # 結果表示 |
| plot(mba[,2:3], type="n", xlim=c(400,750)) | # |
| points(mbam[,2:3], pch=21) | # 男子データ(白丸) |
| points(mbaf[,2:3], pch=19) | # 女子データ(黒丸) |
| abline(mbaf.lm, col="red") | # 女子回帰式 |
| abline(mbam.lm, col="blue") | # 男子回帰式 |
| legend(locator(1), c("男子","女子"), pch=c(21,19)) | # |
| title(main="MBA 入試得点と初年度成績") | # |
| mba2.lm <- lm(初年度成績 ~ 性別 + 性別 : 入試得点, data=mba) | # 性別ごとの回帰 |
| summary(mba2.lm) | # 結果表示 |
| anova(mba2.lm) | # 分散分析表示 |
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 |