2014年度マイコースプログラム

4回生K.K. @統計遺伝学分野

10月3日(金)

plot3dについて

先生のアドバイスを頂いて、plot3dについてようやく分かった。

あるサイトに

library(rgl)
 
z <- matrix(1:20, ncol = 4, nrow = 5)

x <- c(1, 2, 3, 4)       # z 行列の各行の座標
y <- c(1, 2, 3, 4, 5)    # z 行列の各列の座標
 
plot3d(x, y, z)

こんなコードがのっていて、これで書けたと思っていたが、よく見たらこのプロット間違っていた。
x、yのベクトルがループして書けているっぽく見えていただけらしい。
とりあえず正しい使い方が分かったのでよかった。

交互作用を含むモデルの重回帰分析

交互作用の最も単純なモデルとして、性別(1か0)によって年齢の係数がそれぞれalpha,betaに変化するようなモデルをつくって回帰分析をしてみた。
(従属変数が連続量のアウトカム、説明変数が二値的な性別と連続量の年齢の2つで、その2つが交互作用するようなモデル)

k <- 0.2
alpha <- 3
beta <- 2
N <- 100

out. <- function(x){
if (x[2]==1) return(k+alpha*x[1]+rnorm(1))
else return(k+beta*x[1]+rnorm(1))
}

age <- sample(20:80,N,replace=T)
sex <- sample(0:1,N,replace=T)
outcome <- apply(cbind(age,sex),1,out.)

d <- data.frame(cbind(age,sex,outcome))

result <- lm(outcome~age+sex+age*sex,d)

plot3d(age,sex,outcome)

r.c <- result$coefficient

x <- 20:80
y <- 0:1
xy <- as.matrix(expand.grid(x,y))

f <- function(x){
r.c[1]+r.c[2]*x[1]+r.c[3]*x[2]+r.c[4]*x[1]*x[2]
}

z <- apply(xy,1,f)

points3d(xy[,1],xy[,2],z,col=2)

f:id:kouri_don:20141003163251p:plain

黒がデータ点で、赤が回帰モデルによって求めた直線(面)をプロットしたものである。

> summary(result)

Call:
lm(formula = outcome ~ age + sex + age * sex, data = d)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.68398 -0.73942 -0.00973  0.67727  2.69020 

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept)  0.669753   0.437379    1.531    0.129    
age         -2.006617   0.008452 -237.420   <2e-16 ***
sex         -0.895740   0.668276   -1.340    0.183    
age:sex      5.015197   0.012611  397.697   <2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.056 on 96 degrees of freedom
Multiple R-squared:  0.9999,    Adjusted R-squared:  0.9999 
F-statistic: 4.962e+05 on 3 and 96 DF,  p-value: < 2.2e-16

おそらくここに回帰の妥当性にあたる部分が書かれていると思われるが、解読は不能。

試しにこのデータを、交互作用がないようなモデル式に当てはめてみた。

k <- 0.2
alpha <- 3
beta <- -2
N <- 100

out. <- function(x){
if (x[2]==1) return(k+alpha*x[1]+rnorm(1))
else return(k+beta*x[1]+rnorm(1))
}

age <- sample(20:80,N,replace=T)
sex <- sample(0:1,N,replace=T)
outcome <- apply(cbind(age,sex),1,out.)

d <- data.frame(cbind(age,sex,outcome))

result <- lm(outcome~age+sex,d)

summary(result)

plot3d(age,sex,outcome)

r.c <- result$coefficient

x <- 20:80
y <- 0:1
xy <- as.matrix(expand.grid(x,y))

f <- function(x){
r.c[1]+r.c[2]*x[1]+r.c[3]*x[2]
}

z <- apply(xy,1,f)

points3d(xy[,1],xy[,2],z,col=2)

f:id:kouri_don:20141003165313p:plain

結果はこのように、無残なことに。

> summary(result)

Call:
lm(formula = outcome ~ age + sex, data = d)

Residuals:
    Min      1Q  Median      3Q     Max 
-78.094 -37.588  -2.309  38.346  93.767 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -104.9162    13.8046  -7.600 1.88e-11 ***
age            0.1241     0.2511   0.494    0.622    
sex          239.7482     8.8818  26.993  < 2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 44.21 on 97 degrees of freedom
Multiple R-squared:  0.8828,    Adjusted R-squared:  0.8804 
F-statistic: 365.4 on 2 and 97 DF,  p-value: < 2.2e-16

明らかに回帰の妥当性としては劣っているはずだが、どこにその情報があるのか…?
p値をガリガり計算してもよいが、かなり面倒である。

ちなみに、交互作用がないモデルを交互作用を含むようなモデル式に当てはめた場合は、

k0 <- 0.2
k1 <- 0.3
k2 <- 2
N <- 100

out. <- function(x){
k0+k1*x[1]+k2*x[2]+rnorm(1)
}

age <- sample(20:80,N,replace=T)
sex <- sample(0:1,N,replace=T)
outcome <- apply(cbind(age,sex),1,out.)

d <- data.frame(cbind(age,sex,outcome))

result <- lm(outcome~age+sex+age*sex,d)

plot3d(age,sex,outcome)

r.c <- result$coefficient

x <- 20:80
y <- 0:1
xy <- as.matrix(expand.grid(x,y))

f <- function(x){
r.c[1]+r.c[2]*x[1]+r.c[3]*x[2]+r.c[4]*x[1]*x[2]
}

z <- apply(xy,1,f)

points3d(xy[,1],xy[,2],z,col=2)

f:id:kouri_don:20141003170640p:plain

> result

Call:
lm(formula = outcome ~ age + sex + age * sex, data = d)

Coefficients:
(Intercept)          age          sex      age:sex  
  -0.195967     0.305939     1.750063     0.003695  

予想通りではあるが、age*sexの項の係数はほぼ0になって、それなりに妥当な回帰が出来た。

来週の予定としては、まず「回帰の妥当性」についてもう一度考えた後、「傾向スコア分析」なるものについて勉強しようと思う。
それが終わったら論文をいくつか読んで、あとは最終レポート作成…という流れになりそうである。

以上