重回帰分析で単純傾斜を検討するときの個人的な理解の仕方

1 この資料の目的

この資料は,重回帰分析の単純傾斜を検討するときにする変数処理の理屈について,個人的な理解を,統計ソフトのRを使ってデータと照らし合わせながらまとめたものです。以下,なんでこんなものを作ったのかの理由です。

重回帰分析で交互作用の影響を検討するとき,交互作用項を作って重回帰モデルに入れると思います。多くの場合,交互作用項の影響が有意であれば,次に下位検定である単純傾斜(simple slope)の影響を検討をしていきます。

単純主効果を検討するときに,量的変数の調整変数が高い時と低い時の変数を作って,それぞれ検討します。その際,もとの値から-1SDした調整変数の値を調整変数が高い時,もとの値から+1SDした調整変数の値を調整変数が低い時とするのが通例と思います(Rを使った具体的な実行方法だと,例えば広島大学の平川さんの資料がシンプルにまとまっていてわかりやすいかと思います)。

このとき,素朴に感じる疑問は,なんで調整変数の高い時を検討するのに-1SDした変数を高い時の値として扱うのか,ということです。今までグラフの平行移動をイメージして,調整変数の高い場合を検討したいときにはプラス側に移動するから-1SD(実際?は-(+1SD))して,調整変数の低い場合を検討したいときにはマイナス側に移動するから+1SD(実際?は-(-1SD))するという理解でした。でもこれが何でなのか,友人に聞かれた際に明確に答えられなかったので,自分の理解の仕方をまとめてみようと思って作ってみた次第です。

私はあまり数学的な素養がないので,実際のデータと照らし合わせながら理解することを目指します。以下では,Rを使ってやっている処理を可視化しながら説明をしてみます。

1.1 使用したパッケージ

使ってないのも入ってるかも。codeボタンをクリックすればパッケージを読み込むコードが開かれます。

library(knitr)
library(rmdformats)
library(tidyverse)
library(MASS)
library(lattice)
library(jtools)

## Global options
options(max.print="75")
opts_knit$set(width=75)

2 使うデータについて

データは関西学院大学の清水先生のブログからもってきました。詳細も書かれています。以下の3つの変数を関係を検討します。

  • \(y\)(従属変数): 満足度(\(sat\))

  • \(x\)(説明変数): 話す頻度(\(talk\))

  • \(z\)(調整変数): パフォーマンス(\(per\))

dat01 <- read_csv("sampledata_reg.csv")
## Parsed with column specification:
## cols(
##   group = col_double(),
##   sat = col_double(),
##   talk = col_double(),
##   per = col_double(),
##   con = col_double()
## )

dat01としてサンプルデータを読み込みます。データフレームの上からいくつかのデータを見てみるとこんな感じです。

kable(head(dat01))
group sat talk per con
1 3 3 3 1
1 3 2 3 1
1 3 3 3 1
2 3 3 3 0
2 2 1 3 0
2 2 1 3 0

とりあえず,可視化してみます。

g <- ggplot(dat01, aes(x = talk, y = sat, group = per, colour = per)) +
  geom_jitter(height = 0.1, width = 0.4)
g

見た感じ,色の濃いのが右肩下がりで色の薄いのが右肩上がりな様子。 もう少しわかりやすくするために,次は,パフォーマンス(per)の高群と低群のみのデータで描いてみる。なお,今回は高群を1, 低群を0, 中間を2とコーディングしています。

per_h <- mean(dat01$per) + sd(dat01$per)
per_l <- mean(dat01$per) - sd(dat01$per)

dat01$per_hl <- ifelse(dat01$per >= per_h, 1, 
                   ifelse(dat01$per <= per_l, 0, 2))

群分けしたときのそれぞれの人数の確認をしてみます。Var1っていうのが群分けの変数です。Freqは人数です。

kable(table(dat01$per_hl)) 
Var1 Freq
0 42
1 42
2 216

高低群のみをグラフにして,それぞれの群の回帰直線をかいてやるとわかりやすいかもしれません。

dat02 <- dplyr::filter(dat01, per_hl != 2)
dat02$per_hl <- as.factor(dat02$per_hl) 
g01 <- ggplot(dat02, aes(x = talk, y = sat, group = per_hl, colour = per_hl)) +
  geom_jitter(height = 0.1, width = 0.4) +
  stat_smooth(method = "lm")
g01

交互作用有りっぽい図が描けました。こういう結果(高群は回帰係数が正,低群は回帰係数が0か負)に近い分析結果ならokだと考えられます。

3 回帰分析して手順の正しさを確認

交互作用が有意なことを確認(talkとperは中心化した変数を使用している)。jtoolパッケージが良さげだと聞いたのでsummary()ではなくsumm()で結果をみています。

dat01$per_c <- dat01$per - mean(dat01$per)
dat01$talk_c <- dat01$talk - mean(dat01$talk) 
result <- lm(sat ~ talk_c + per_c + talk_c:per_c, dat01)
summ(result)
## MODEL INFO:
## Observations: 300
## Dependent Variable: sat
## Type: OLS linear regression 
## 
## MODEL FIT:
## F(3,296) = 27.58, p = 0.00
## R2 = 0.22
## Adj. R2 = 0.21 
## 
## Standard errors: OLS
## ------------------------------------------------
##                      Est.   S.E.   t val.      p
## ------------------ ------ ------ -------- ------
## (Intercept)          3.42   0.05    66.77   0.00
## talk_c               0.27   0.05     5.12   0.00
## per_c                0.14   0.03     4.78   0.00
## talk_c:per_c         0.13   0.03     4.29   0.00
## ------------------------------------------------

次に確認。高群は\(-1SD\),低群は\(+1SD\)した推定値が最初に可視化したものと似るはず。答えが正しいことの確認をしてから説明に入ります。

3.1 パフォーマンス高群の結果

コードを見てもらえばわかると思いますが,高群を作るときに,\(per\)\(-1SD\)してます。talkの変数は中心化したものを使っています。

dat01$per_high <- dat01$per_c - sd(dat01$per_c)
result_h <- lm(sat ~ talk_c + per_high + talk_c*per_high, dat01)
summ(result_h)
## MODEL INFO:
## Observations: 300
## Dependent Variable: sat
## Type: OLS linear regression 
## 
## MODEL FIT:
## F(3,296) = 27.58, p = 0.00
## R2 = 0.22
## Adj. R2 = 0.21 
## 
## Standard errors: OLS
## ---------------------------------------------------
##                         Est.   S.E.   t val.      p
## --------------------- ------ ------ -------- ------
## (Intercept)             3.66   0.07    50.15   0.00
## talk_c                  0.49   0.07     6.98   0.00
## per_high                0.14   0.03     4.78   0.00
## talk_c:per_high         0.13   0.03     4.29   0.00
## ---------------------------------------------------

\(talk\)の回帰係数は\(.49\)

3.2 パフォーマンス低群の結果

同じく中心化もして,\(per\)\(+1SD\)してます。

dat01$per_low <- dat01$per_c + sd(dat01$per_c)
result_l <- lm(sat ~ talk_c + per_low + talk_c*per_low, dat01)
summ(result_l)
## MODEL INFO:
## Observations: 300
## Dependent Variable: sat
## Type: OLS linear regression 
## 
## MODEL FIT:
## F(3,296) = 27.58, p = 0.00
## R2 = 0.22
## Adj. R2 = 0.21 
## 
## Standard errors: OLS
## --------------------------------------------------
##                        Est.   S.E.   t val.      p
## -------------------- ------ ------ -------- ------
## (Intercept)            3.17   0.07    43.81   0.00
## talk_c                 0.04   0.08     0.48   0.63
## per_low                0.14   0.03     4.78   0.00
## talk_c:per_low         0.13   0.03     4.29   0.00
## --------------------------------------------------

\(talk\)の回帰係数は\(0.037\)で可視化したものに近くなりました。処理の仕方はこれで正しいと思われます。

3.3 結果の比較

jtoolパッケージ遊びのために,平均,高群,低群の結果をいろいろな形で見比べてもみます。

plot_summs(result, result_h, result_l,
           model.names = c("mean", "high", "low"))

talk_cの効果だけ違うのがよくわかりやすい気がします。変数名を変えなければもっと見やすくはなるかもしれません。

Tableにもできるみたいだけど,別のパッケージが必要になるみたいなのでstargazerパッケージでさくっと結果をまとめてみます。

library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
stargazer(result, result_h, result_l, type = "html",
          column.labels = c("mean", "high", "low"))
Dependent variable:
sat
mean high low
(1) (2) (3)
talk_c 0.266*** 0.494*** 0.037
(0.052) (0.071) (0.078)
per_c 0.141***
(0.029)
talk_c:per_c 0.130***
(0.030)
per_high 0.141***
(0.029)
talk_c:per_high 0.130***
(0.030)
per_low 0.141***
(0.029)
talk_c:per_low 0.130***
(0.030)
Constant 3.416*** 3.663*** 3.170***
(0.051) (0.073) (0.072)
Observations 300 300 300
R2 0.218 0.218 0.218
Adjusted R2 0.211 0.211 0.211
Residual Std. Error (df = 296) 0.884 0.884 0.884
F Statistic (df = 3; 296) 27.576*** 27.576*** 27.576***
Note: p<0.1; p<0.05; p<0.01

4 交互作用項を含む重回帰分析における単純主効果の検討方法の意味

4.1 前提

\(Y = \beta_{頻度}talk得点 + \beta_{パフォーマンス}per得点 + \beta_{頻度*パフォーマンス}talk得点*per得点+ 切片\)

これを\(talk得点\)について,まとめていくと

\(Y = (\beta_{頻度} + \beta_{頻度*パフォーマンス}per得点)talk得点 + \beta_{パフォーマンス}per得点 + 切片\)

つまり,\(talk得点\)の傾きは\(per得点\)の値によって変化することがわかります。そして,\(per得点\)の高い時と低い時によって\(talk\)得点の影響が変わってきます。慣例のAken & West(1991)あたりに従って,平均から\(1SD\)離れたあたりをとっています。

ちなみに,

\(Y = (\beta_{頻度} + \beta_{頻度*パフォーマンス}per得点)talk得点 + \beta_{パフォーマンス}per得点 + 切片\)

に先ほどの最初に確かめた中心化した2つの変数を入れた重回帰分析の推定値とperの1SDの値を代入すると,+1SDを代入したときには,高群の回帰係数0.49,-1SDを代入したときには低群の回帰係数0.037と大体同じ推定値が得られることがわかります。こうして得られた推定値が有意か否かは,推定値の差分を使って求めることができます。詳細はRobinson, Tomek, & Schumacker(2013)PDF注意を参照ください。

sd(dat01$per)
## [1] 1.756184

\(\hat{Y} = (0.27 + 0.13per得点)talk得点 + 0.14per得点 + 3.42\)

perのSDは1.76なので,高群の場合のtalkの回帰係数の推定値を求める場合は,上の式に1.76を代入します。

\(\hat{Y} = (0.27 + 0.13 \times 1.76)talk得点 + 0.14 \times 1.76 + 3.42\)

\(\hat{Y} = 0.50talk得点 + 3.67\)

低群の場合は,-1.76を代入します。

\(\hat{Y} = (0.27 + 0.13 \times (-1.76))talk得点 + 0.14 \times (-1.76) + 3.42\)

\(\hat{Y} = 0.04talk得点 + 3.17\)

となり,回帰係数と切片の値は大体一致します。

4.2 なぜ単純傾斜を重回帰分析で検討するときは\(-1SD\)した変数を高群,\(+1SD\)した変数を低群として扱うのか

ようやく本題です。これ正確には高群では1SDを低群では-1SDを代入しています。なぜ以下では,なぜ符号が入れ替わるのかを説明するのを頑張ってみます。

例えば,前田(2008)でも書かれているように,

高群を検討する変数をつくるときは,

\(調整変数_{高群} = 調整変数 - (1SD)\)

低群を検討する変数をつくるときは,

\(調整変数_{低群} = 調整変数 - (-1SD)\)

という処理をしており,結果的に高群では-1SDして,低群では+1SDすることとなっています。

4.2.1 \(per得点\)が平均値のときを考える

ここで,全ての変数をセンタリングして解析したとすれば,\(per得点\)が平均値のときには\((\beta_{頻度}+\beta_{頻度*パフォーマンス}\times 0)talk得点\)となって交互作用項を考慮する必要がなくなります。もともとの重回帰分析の係数の解釈は,他の係数が0のときの効果であることも思い出しておきましょう。

dat01m <- dplyr::filter(dat01, per_hl == 2)
g03m <- ggplot(dat01m, aes(x = talk_c, y = sat, colour = per_hl)) +
  geom_jitter(height = 0.1, width = 0.4) +
  stat_smooth(method = "lm")
g03m

今後のために,\(per\)得点を込みにした3次元で考えてみます。2次元のグラフはこれを\(talk\)側から見て,\(per\)得点を考慮せずに見たものとなります(ブルドーザーで押しつぶす感じ。 perを周辺化する感じのイメージ)。

lattice::cloud(sat ~ talk_c * per_c, data = dat01, groups = per_hl)

無理やり3Dプロットで考えると,緑のプロットの人たち(\(per=0\)(中心化しているので))の\(talk\)回帰係数を意味します。普通の重回帰分析で出てくる\(talk\)の回帰係数は,緑のプロットにおける回帰係数が推定されています。 交互作用が有意とはピンクや青のプロットの人たちは,緑のプロットの人たちとは\(talk\)の回帰係数が異なることを意味するので,別途確認しなくてはいけません。

4.3 3D plotでper得点の高低がどの辺にあるかを考える

見辛いので\(perの1SD\)以上と以下の人だけをプロットすると,ちゃんと\(per\)得点の高低で傾向の違う様子がわかります。

lattice::cloud(sat ~ talk * per, data = dat02, groups = per_hl)

なお,これを2次元につぶすとこのように見えます(\(per\)次元をつぶす)

dat02 <- mutate(dat02, talk_c = talk - mean(talk))
g01 <- ggplot(dat02, aes(x = talk_c, y = sat, group = per_hl, colour = per_hl)) +
  geom_jitter(height = 0.1, width = 0.4) +
  stat_smooth(method = "lm")
g01

\(per\)\(1SD\)高い状態をみるときには,実際に\(per\)\(1SD\)高い人たちのデータのみを使うのではなく,\(per\)\(1SD\)低い状態に全体的に動かすことで,対処しています。ここで思い出して欲しいのは,\(talk\)の回帰係数は,\(per = 0\)かつ\(per \times talk = 0\)のときの影響であり,センタリングをしている変数\(per_c = 0\)のときとは,\(per\)が平均値の時のことを意味しています。

今確認したいのは,\(per_{高群}\)であり,平均よりも\(1SD\)高い時なので,\(per_{高群} = 0\)\(1SD\)高い値となるような変数\(per_{高群}\)を作ってあげる必要があります。

lattice::cloud(sat ~ talk * per, data = dat01, groups = per_hl)

この3Dプロットでいうと,ピンク色のプロット(\(1SD\)高い状態)を\(per = 0\)として,\(talk\)の回帰係数を考えられる状態をつくることを意味します。\(per_{高群} = per_c - 1SD\)とすることで,平均値は,全体的に負方向に推移し,\(per_{高群}= 0\)のときには,実質的に\(per = 1SD\)の状態を検討できます。そのため,\(per_c\)の値に\(1SD\)加算するのではなく,\(1SD\)減算する必要があります。

回帰分析において,調整変数が\(1SD\)分高い状態における説明変数と従属変数の関連を検討する際には,調整変数を\(+1SD\)高い状態が基準(調整変数の得点が0)となるようにした新たな変数\(調整変数_{高群}\)を作成する必要がある。\(調整変数_{高群}\)を作成する際には,\(1SD\)分加算するのではなく\(1SD\)減算する操作を加えることとなる。

同様に,\(1SD\)低い状態を考える時は,青色のプロット(\(1SD\)低い状態)を\(per_{低群} = 0\)として,\(talk\)の回帰係数を考えられるようにする必要があります。そのため,新たに作成する調整変数\(per_{低群}\)\(per_c\)から\(1SD\)加算(正確には\(-1SD\)分を減算)する必要があります。

4.4 per高群,低群および平均値のデータセットの可視化(たぶん,こんがらがるポイント)

まずは,単純に\(per\)\(sat(Y)\)の関連をみる。\(per\)は中心化してあります。黒い点や線が平均,赤い点や線が高群とされているもの(\(per_c - 1SD\)),青い点や線が低群とされているもの(\(per_c - (-1SD)\))を示します。

g04 <- ggplot(dat01, aes(x = per_c, y = sat)) +
  geom_jitter(height = 0.1, width = 0.4, colour = "black", alpha = 0.5) +
  stat_smooth(method = "lm", colour = "black") + geom_jitter(aes(x = per_high, y = sat), height = 0.1, width = 0.4, colour = "red", alpha = 0.5) +
  stat_smooth(aes(x = per_high, y = sat), method = "lm", colour = "red") + 
  geom_jitter(aes(x = per_low, y = sat), height = 0.1, width = 0.4, colour = "blue", alpha = 0.5) +
  stat_smooth(aes(x = per_low, y = sat), method = "lm", colour = "blue") +
  xlab("per_high(red), per_c(black), per_low(blue)")
g04

たぶん,高群なのに\(1SD\)引いて,低群なのに\(1SD\)足すの?って気になってしまう人のは,こんなグラフを思い浮かべているんだと思います。なぜ,結果的に\(per_c\)の値を低くした変数を\(per_{高群}\)といわれていて,\(per_c\)の値を高くするときに\(per_{低群}\)といわれているのか,ということかなと。

上のグラフでも示されているが,以下のように平均値を算出すると\(per_{low}\)\(per_{high}\)のよりも大きな値となっていることが確認できます。なぜ\(per_{low}\)の値のほうが\(per_{high}\)よりも高い数値なのに\(per_{low}\)\(per_c\)の代わりに代入して重回帰分析したときには,低群の結果といえるのか,疑問に感じている,ということだと思います。

dat01 %>% 
  dplyr::select(per, per_c, per_high, per_low) %>% 
  summarise_all(funs(mean)) %>% 
  kable(digits =2)
per per_c per_high per_low
4.69 0 -1.76 1.76

\(sat\)得点を\(talk_c\)\(per_{high}\)およびその交互作用を使って重回帰分析で予測することは,\(per_{high}\)については赤い線の部分の回帰を行なっていることになります。

重回帰分析の回帰係数は,他の回帰係数が0だったときの回帰係数を推定するので,\(per_{high} = 0\)のときの\(talk\)の回帰係数が推定されることとなります。\(per_{high}\)の平均値は0ではなく-1.76であり,\(per_{high}=0\)とは,下の赤い散布図を見ればわかるようにパフォーマンス(\(per\))が高い人たちであることがわかります。会話頻度(\(talk\))の回帰係数は,\(per_c\)とは異なり,\(per_{high} = 0\),つまり\(per = Mean + 1SD\)のときの回帰係数を意味するようになります。そのため,\(per_c - 1SD\)\(per_{高群}\)とみなせます。

g05 <- ggplot(dat01, aes(x = per_high, y = sat)) +
  geom_jitter(height = 0.1, width = 0.4, colour = "red", alpha = 0.5) +
  stat_smooth(method = "lm", colour = "red") +
  geom_vline(xintercept = 0)
g05

\(per_{低群} = per_c + 1SD\)のときも同様に考えられます。\(per_{low}\)の平均値は0ではなく1.76であり,\(per_{low}=0\)とは,下の青い散布図を見ればわかるようにパフォーマンス(\(per\))が低い人たちであることがわかります。会話頻度(\(talk\))の回帰係数は,\(per_c\)とは異なり,\(per_{low} = 0\),つまり\(per = Mean - 1SD\)のときの回帰係数を意味するようになります。そのため,\(per_c + 1SD\)\(per_{低群}\)とみなせます。

g06 <- ggplot(dat01, aes(x = per_low, y = sat)) +
  geom_jitter(height = 0.1, width = 0.4, colour = "blue", alpha = 0.5) +
  stat_smooth(method = "lm", colour = "blue") +
  geom_vline(xintercept = 0)
g06

4.4.1 グラフの平行移動について

ここでは,なぜ高群のときに“調整変数を\(+1SD\)高い状態が基準(調整変数の得点が0)となるように平行移動させることを意味し,実際には調整変数に対して\(1SD\)分加算するのではなく\(1SD\)減算する操作を加える”,低群のときに“調整変数である\(per\)\(1SD\)加算(正確には\(-1SD\)分を減算)”と書いたか説明を試みます。蛇足かも。

基礎知識確認

\(y=x\)のグラフをx軸に沿ってa平行移動させると\(y = x-a\)と表現できる。-a平行移動させる場合は,\(y = x-(-a)\)と表現できます。

例えば,以下に示す\(y = 2x\)の緑のグラフをx軸方向に2平行移動させると\(y = 2(x - 2)\)となり,赤のグラフ(\(y = 2x - 4\))となる。\(y = 2x - 4\)\(x = 0\)のとき,\(y = -4\)となります。

次に\(y = 2x\)の緑のグラフをx軸方向に-2平行移動させるとする。その場合,\(y = 2(x - (-2))\)となり,青のグラフ\(y = 2x + 4\)となる。\(y = 2x + 4\)\(x = 0\)のとき,\(y = 4\)となります。

func <- function(x){2*x}
func_h <- function(x){2*x - 4}
func_l <- function(x){2*x + 4}
plot(func, -5, 5, col = "green")
plot(func_h, -5, 5, col = "blue", add = TRUE)
plot(func_l, -5, 5, col = "red", add = TRUE)
abline(v = 0, lty = 2, add =TRUE)
abline(h = 0, lty = 2, add =TRUE)
text(4, labels = "y = 2x + 4", col = "red")
text(0, labels = "y = 2x", col = "green")
text(-5, labels = "y = 2x - 4", col = "blue")

これをさきほどの重回帰分析(\(Y = \beta_{頻度}talk得点 + \beta_{パフォーマンス}per得点 + \beta_{頻度*パフォーマンス}talk得点*per得点+ 切片\))の高群と低群を作る手続きに合わせてみると,

  • \(per_{高群}\)を作るときは,緑のグラフを赤のグラフまで\(1SD\)平行移動することを意味します。\(per\)軸方向に\(1SD\)平行移動するため,\(1SD\)分減算します。こうすることで,\(talk\)の回帰係数は,\(per = 0\)のとき実際には\(per = 1SD\)として解釈できるようになります。

  • \(per_{低群}\)を作るときは,緑のグラフを青のグラフの位置に移動させるように,\(per\)軸方向に-1SD平行移動させるため,1SD加算することにつながります。こうすることで,\(talk\)の回帰係数は,\(per = 0\)のとき実際には\(per = -1SD\)として解釈できるようになります。

これで一応,なぜ高群を検討するときに\(-1SD\)し,低群を検討するときに\(+1SD\)するか理解できる(といいな)。

4.4.2 \(+1SD\)を検討するとき素直に加算するとどうなるか

気になったのでこれも検討してみる。これまでと基本的には同じことを試しているだけです。

xとyという2つの変数があったときに,xの\(SD=2\)だったとする。xとyの関係は緑のグラフに表します。

そうして,高群を検討したいから,単純に1SD分加算したもの(つまり,\(x+2\))とyの関係を青のグラフに表すと以下のようになります。

x = seq(-5, 5, 1)
y = seq(-10, 10, 2)
d <- matrix(c(x, y), ncol = 2)
dat_test <- data.frame(d) 
colnames(dat_test) <- c("x", "y")
dat_test$x_plus_1sd <- dat_test$x + 2
g <- ggplot(dat_test) +
  geom_point(aes(x = x, y = y), colour = "green") +
  geom_point(aes(x = x_plus_1sd, y = y), colour = "blue")
g

先ほどのように考えてみると,緑のグラフから青のグラフへのx軸方向への移動は,\(-1SD\)\(x\)軸方向に平行移動させたことを意味し,なんらかの変数と交互作用が有意であった場合,青のグラフの変数\(x\)の得点を使って重回帰分析にかけると,\(x = 0\)のとき,\(x\)\(-1SD\)分小さい値となり,もう一つの変数の回帰係数は,低群の効果を意味することになってしまいます。

5 まとめ

調整変数の高群,低群を作って再度重回帰分析で説明変数の変化を検討する場合,

  • 高群にはセンタリングした調整変数に\(-1SD\)した変数を作成して,重回帰分析を行う。

  • 低群にはセンタリングした調整変数に\(+1SD\)した変数を作成して,重回帰分析を行う。

  • 符号が逆転する理由は,説明変数の回帰係数の解釈のさせ方を変えられるようにするためである。 *ie., 高群であれば,調整変数の全体の平均値を1SD低くしているため,調整変数が0のときの説明変数の回帰係数の解釈は,調整変数が1SD分の高いときの解釈となる。低群であれば,調整変数の全体の平均値を1SD高くしているため,調整変数が0のときの説明変数の回帰係数の解釈は,調整変数が1SD分の低いときの解釈となる。

ついでに,

  • 重回帰式に代入して,説明変数の回帰係数を算出するとき:センタリングした変数を用いて推定された回帰係数を代入し,調整変数の得点には,高群のときには+1SDの値を,低群のときには-1SDの値を代入したら算出できる。ただし,それにくわえてプールされた標準誤差を算出して,回帰係数の差分の有意性検定を行うことになるっぽい。

6 実行環境

sessionInfo()
## R version 3.5.2 (2018-12-20)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932   
## [3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C                  
## [5] LC_TIME=Japanese_Japan.932    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] stargazer_5.2.2  jtools_2.0.1     lattice_0.20-38  MASS_7.3-51.1   
##  [5] forcats_0.4.0    stringr_1.4.0    dplyr_0.8.0.1    purrr_0.3.0     
##  [9] readr_1.3.1      tidyr_0.8.2      tibble_2.0.1     ggplot2_3.1.0   
## [13] tidyverse_1.2.1  rmdformats_0.3.5 knitr_1.22      
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.0       lubridate_1.7.4  assertthat_0.2.0 digest_0.6.18   
##  [5] mime_0.6         R6_2.4.0         cellranger_1.1.0 plyr_1.8.4      
##  [9] backports_1.1.3  evaluate_0.13    ggstance_0.3.1   httr_1.4.0      
## [13] highr_0.7        pillar_1.3.1     rlang_0.3.1      lazyeval_0.2.1  
## [17] readxl_1.3.0     rstudioapi_0.9.0 miniUI_0.1.1.1   rmarkdown_1.12  
## [21] labeling_0.3     questionr_0.7.0  pander_0.6.3     munsell_0.5.0   
## [25] shiny_1.2.0      broom_0.5.1      compiler_3.5.2   httpuv_1.4.5.1  
## [29] modelr_0.1.4     xfun_0.5         pkgconfig_2.0.2  htmltools_0.3.6 
## [33] tidyselect_0.2.5 bookdown_0.9     crayon_1.3.4     withr_2.1.2     
## [37] later_0.8.0      grid_3.5.2       nlme_3.1-137     jsonlite_1.6    
## [41] xtable_1.8-3     gtable_0.2.0     magrittr_1.5     scales_1.0.0    
## [45] cli_1.0.1        stringi_1.3.1    promises_1.0.1   xml2_1.2.0      
## [49] generics_0.0.2   tools_3.5.2      glue_1.3.0       hms_0.4.2       
## [53] yaml_2.2.0       colorspace_1.4-0 rvest_0.3.2      haven_2.1.0

Masaru Tokuoka

2020-03-23