例を用いて,重回帰分析プログラムを説明する。30人に対して性別・年齢・肺活量は,「6分間歩行距離」に対して,どのような影響を与えるのかを調べたい。実験したデータは下記のプログラムに入力してある。ここで従属変数:y =「6分間歩行距離」,複数の独立変数:x1 =「性別」, x2 =「年齢」, x3 = 「肺活量」となっている。
#重回帰分析
#例1のデータ
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)
)
# 動的にモデル式を構築
response_var <- "y" # 目的変数の名前
predictor_vars <- setdiff(names(data), response_var) # 予測変数の名前を抽出
formula <- as.formula(paste(response_var, "~", paste(predictor_vars, collapse = " + ")))
# 重回帰モデルの作成
k1 <- lm(formula, data = data)
# 結果を出力
#cat("\n重回帰分析の結果:\n")
#print(summary(k1))
# 回帰式の作成
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("重回帰式: ", equ, "\n")
# データを標準化
d_std <- as.data.frame(scale(data))
# 標準化データで重回帰分析
k2 <- lm(formula, data = d_std)
# 標準化結果を出力
#cat("\n標準重回帰分析の結果:\n")
#print(summary(k2)$coefficients)
# 標準偏回帰係数を計算
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")
cat("無視可の変数:", paste(ignored_vars, collapse = ", "), "\n")
# 結果を出力
cat("無視可の変数を除いた重回帰式: ", reduced_equation, "\n")
## 重回帰式: y = -217.14 + -7.11*x1 + -0.14*x2 + 0.33*x3
## 無視可の変数: x1, x2
## 無視可の変数を除いた重回帰式: y = -217.14 + 0.33*x3