例を用いて,重回帰分析を説明する。30人に対して性別・年齢・肺活量は,「6分間歩行距離」に対して,どのような影響を与えるのかを調べたい。実験したデータは下記のプログラムに入力してある。ここで従属変数:y =「6分間歩行距離」,複数の独立変数:x1 =「性別」, x2 =「年齢」, x3 = 「肺活量」となっている。

# 必要なパッケージをインストール(初回のみ実行)
if (!requireNamespace("car", quietly = TRUE)) {
  install.packages("car")
}
# car パッケージをロード
library(car)
## Warning: パッケージ 'car' はバージョン 4.4.2 の R の下で造られました
## 要求されたパッケージ carData をロード中です
## Warning: パッケージ 'carData' はバージョン 4.4.2 の R の下で造られました
#重回帰分析
#データ
data <- data.frame(
  y = c(340,355,370,430,410,300,270,290,305,150,240,500,480,370,190,
        210,360,420,455,520,310,90,145,200,300,230,400,435,160,460),
  x1 = c(0,0,1,1,1,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,0),
  x2 = c(61,68,73,73,65,69,79,75,72,81,69,70,76,71,81,68,73,69,71,56,
         78,83,71,68,64,74,76,71,73,66),
  x3 = c(1800,1850,1920,2030,1970,1600,1530,1590,1630,1200,1390,2300,
         2200,1900,1310,1400,1870,1900,2100,2300,1610,1000,1130,1360,
         1580,1410,1830,2000,1310,2010)
)

# 重回帰分析を実行
k1 <- lm(y ~ x1 + x2 +x3, data = data) #独立変数がn個の場合,x1+x2+...+xn

# 結果を出力
cat("\n重回帰分析の結果:\n")
## 
## 重回帰分析の結果:
print(summary(k1)$coefficients)
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept) -217.1379767 57.63782728 -3.7672825 8.552391e-04
## x1            -7.1123657  6.88977331 -1.0323076 3.114355e-01
## x2            -0.1426724  0.63625640 -0.2242373 8.243255e-01
## x3             0.3257244  0.01128511 28.8631983 2.809687e-21
# 回帰式の作成
coef <- coef(k1)
intercept <- round(coef[1], 2)  # 切片
terms <- paste0(round(coef[-1], 2), "*", names(coef[-1]))
equ <- paste0("y = ", intercept, " + ", paste(terms, collapse = " + "))

# 結果を出力
cat("\n重回帰式: ", equ, "\n")
## 
## 重回帰式:  y = -217.14 + -7.11*x1 + -0.14*x2 + 0.33*x3
f_stat <- summary(k1)$fstatistic
p_value <- pf(f_stat[1], f_stat[2], f_stat[3], lower.tail = FALSE)
cat("\nF統計量(F-statistic)のp値 = ", p_value, "\n")
## 
## F統計量(F-statistic)のp値 =  7.323281e-22
cat("\n決定係数(Multiple R-squared) = ", summary(k1)$r.squared, "\n")
## 
## 決定係数(Multiple R-squared) =  0.9787811
cat("\n分散拡大係数VIF:", vif(k1), "\n")
## 
## 分散拡大係数VIF: 1.107133 1.280894 1.401142
# データを標準化
d_std <- as.data.frame(scale(data))

# 標準化データで重回帰分析
k2 <- lm(y ~ x1 + x2+x3, data = d_std) #独立変数がn個の場合,x1+x2+...+xn

# 結果を出力
cat("\n標準重回帰分析の結果:\n")
## 
## 標準重回帰分析の結果:
print(summary(k2)$coefficients)
##                  Estimate Std. Error       t value     Pr(>|t|)
## (Intercept) -1.591895e-16 0.02808747 -5.667635e-15 1.000000e+00
## x1          -3.103011e-02 0.03005897 -1.032308e+00 3.114355e-01
## x2          -7.250011e-03 0.03233187 -2.242373e-01 8.243255e-01
## x3           9.760223e-01 0.03381546  2.886320e+01 2.809687e-21
# 標準偏回帰係数を計算
std_coefficients <- coef(k1)[-1] * (apply(data[, -1], 2, sd) / sd(data$y))
names(std_coefficients) <- names(coef(k1))[-1]

# 無視可の変数を判定
p_values <- summary(k1)$coefficients[-1, 4]  # p値を抽出(切片を除く)
ignored_vars <- names(std_coefficients)[abs(std_coefficients) <= 0.2 & p_values >= 0.05]

# 使用する変数(無視可でないもの)
used_vars <- names(std_coefficients)[abs(std_coefficients) > 0.2]

# 無視可の変数を除いた回帰式を作成
if (length(used_vars) > 0) {
  used_coefficients <- coef[used_vars]
  terms_used <- paste0(round(used_coefficients, 2), "*", used_vars)
  reduced_equation <- paste0("y = ", intercept, " + ", paste(terms_used, collapse = " + "))
} else {
  reduced_equation <- paste0("y = ", intercept)  # すべて無視可の場合
}
# 無視可の変数をリスト表示
cat("\n**標準偏回帰係数の予測値≦0.2かつp≧0.05,この変数は無視しても可**\n")
## 
## **標準偏回帰係数の予測値≦0.2かつp≧0.05,この変数は無視しても可**
cat("\n無視可の変数:", paste(ignored_vars, collapse = ", "), "\n")
## 
## 無視可の変数: x1, x2
# 結果を出力
cat("\n無視可の変数を除いた重回帰式: ", reduced_equation, "\n")
## 
## 無視可の変数を除いた重回帰式:  y = -217.14 + 0.33*x3