- Rの傾向性の検定関数prop.trend.test()を見てみよう
- 以下に示すように、xというベクトルとnというベクトルとscoreというカテゴリの「値ベクトル」が入力
- いわゆる分割表的に言えば、x,n-xがケースとコントロールのベクトルで、nはケース・コントロールの和のベクトル
- scoreは、カテゴリに与えた値であり、「まっすぐなトレンド」のときは、"1,2,3,4,..."と言う値付けをする
- SNP 2x3 で優性モデルにするときは、"1,2,2"(とか、もっとわかりやすく"0,1,1"とか)にする
- 内部ではカテゴリごとのケースの全体に対する比率freqとカテゴリの値scoreとの間でlm()線形回帰している
- 線形回帰をするときにweights = w = n/(p(1-p))を与えている。ここでpはケース数がケース+コントロールの総数に占める比率である
- lm()では、sum(w*e^2)が最小になるように最小二乗法を用いている
- このlm()の結果をanova()してカイ二乗分布に従う統計量chisqを出している
- トレンド検定では、「カテゴリの値、傾け方」はベクトルで指定(score)していて、その「傾け方」の形をそのままに急傾斜にしたり緩傾斜にしたりしているので、自由度は1
> prop.trend.test
function (x, n, score = seq_along(x))
{
method <- "Chi-squared Test for Trend in Proportions"
dname <- paste(deparse(substitute(x)), "out of", deparse(substitute(n)))
dname <- paste(dname, ",\n using scores:", paste(score, collapse = " "))
x <- as.vector(x)
n <- as.vector(n)
score <- as.vector(score)
freq <- x/n
p <- sum(x)/sum(n)
w <- n/p/(1 - p)
a <- anova(lm(freq ~ score, weights = w))
chisq <- a["score", "Sum Sq"]
names(chisq) <- "X-squared"
df <- c(df = 1)
pval <- pchisq(chisq, 1, lower.tail = FALSE)
rval <- list(statistic = chisq, parameter = df, p.value = as.numeric(pval),
method = method, data.name = dname)
class(rval) <- "htest"
return(rval)
}
<bytecode: 0000000009DF3480>
<environment: namespace:stats>