Excel にある二変量統計関数 Last modified: Oct 24, 2004
目的
Excel にある二変量統計関数を R で定義する
使用法
correl(x, y)
covar(x, y)
forecast(data, y, x)
growth(y, x, data, one=FALSE)
intercept(y, x)
logest(y, x, one=FALSE)
pearson(x, y)
rsq(y, x)
slope(y, x, zero=FALSE)
steyx(y, x)
trend(y, x, data, zero=FALSE)
引数
x は独立変数
y は従属変数
data は予測値を求める独立変数の値
growth,logest 関数の引数の one は FALSE または TRUE の値を取る。y = a bx において,TRUE の場合には a = 1 として b のみを求める。FALSE の場合は a,b ともに求める。FALSE の場合には one=FALSE は省略できる。
slope,trend 関数の引数の zero は FALSE または TRUE の値を取る。y = a+b x において,TRUE の場合には a = 0 として b のみを求める(原点を通る回帰直線)。FALSE の場合は a,b ともに求める。FALSE の場合には zero=FALSE は省略できる。
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/bivariate.R", encoding="euc-jp")
# Excel の二変量統計関数
correl <- cor # 単に名前の違い。ただし,cor(x, y) の場合のみ
covar <- function(x, y) # 共分散(不偏共分散ではない)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
n <- length(x) # ケース数
var(x, y)*(n-1)/n # Excel は共変動をデータ数(n)で割ったものとして定義している
}
forecast <- function(data, y, x) # R の特徴で,data はスカラーでもベクトルでもかまわない
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
mean(y)+var(x, y)/var(x)*(data-mean(x)) # y,x について回帰直線を求め,独立変数の値が data のときの予測値を求める
}
growth <- function(y, x, data, one = FALSE) # R の特徴で,data はスカラーでもベクトルでもかまわない
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
stopifnot(all(y > 0)) # 従属変数はすべて正の値を取らなければならない
y <- log(y) # y = a*b^x の,両辺の対数をとり,直線回帰に持ち込む
if (one) { # y,x について y = b^x にあてはめ,独立変数の値が data のときの予測値を求める
b <- sum(x*y)/sum(x^2) # 原点を通る直線
const <- 0
}
else { # y,x について y = a*b^x にあてはめ,独立変数の値が data のときの予測値を求める
b <- var(x, y)/var(x) # 切片を持つ直線
const <- mean(y)-b*mean(x)
}
exp(const+b*data) # 予測値を計算し,その指数をとって元の尺度に戻す
}
intercept <- function(y, x)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
mean(y)-var(x, y)/var(x)*mean(x) # 回帰直線の切片
}
logest <- function(y, x, one = FALSE)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
stopifnot(all(y > 0)) # 従属変数はすべて正の値を取らなければならない
y <- log(y) # y = a*b^x の,両辺の対数をとり,直線回帰に持ち込む
if (one) { # y,x について y = b^x にあてはめ,b を求める
b <- sum(x*y)/sum(x^2) # 原点を通る直線
const <- 0
}
else { # y,x について y = a*b^x にあてはめ,a と bを求める
b <- var(x, y)/var(x) # 切片を持つ直線
const <- mean(y)-b*mean(x)
}
list(model="a*b^x", result=c(a=exp(const), b=exp(b)))
}
pearson <- cor # 単に名前の違い
rsq <- function(y, x)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
cor(y, x)^2 # 単相関係数の二乗
}
slope <- function(y, x, zero = FALSE)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
ifelse(zero, sum(x*y)/sum(x^2), # zero=TRUE のときには,原点を通る回帰直線の傾きを計算する
var(x, y)/var(x)) # zero=FALSE のときには,切片を持つ回帰直線の傾きを計算する
}
steyx <- function(y, x)
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
n <- length(x)
sqrt((var(y)-var(x, y)^2/var(x))*(n-1)/(n-2)) # 回帰直線において,回帰からの標本標準偏差(残差に対する平均平方の平方根)を計算する
}
trend <- function(y, x, data, zero = FALSE) # R の特徴で,data はスカラーでもベクトルでもかまわない
{
OK <- complete.cases(x, y) # 二変数ともに欠損値を持たないケースを選択する
x <- x[OK]
y <- y[OK]
ifelse(zero, sum(x*y)/sum(x^2)*data, # zero=TRUE のときには,原点を通る回帰直線による予測値を計算する
intercept(y, x)+var(x, y)/var(x)*data) # zero=FALSE のときには,切片を持つ回帰直線による予測値を計算する
}
使用データ例
x <- c(3, 5, 4, 8, 2, 1) # 独立変数
y <- c(2, 4, 5, 7, 1, 6) # 従属変数
使用例と出力結果例
> correl(x, y)
[1] 0.4925158
> covar(x, y)
[1] 2.361111
> forecast(6, y, x)
[1] 5.162162
> growth(y, x, 6)
[1] 4.677107
> growth(y, x, 6, one=TRUE)
[1] 5.228738
> intercept(y, x)
[1] 2.405405
> logest(y, x)
$model
[1] "a*b^x"
$result
a b
2.010295 1.151117
> logest(y, x, one=TRUE)
$model
[1] "a*b^x"
$result
a b
1.000000 1.317446
> pearson(x, y)
[1] 0.4925158
> rsq(y, x)
[1] 0.2425718
> slope(y, x)
[1] 0.4594595
> slope(y, x, zero=TRUE)
[1] 0.9243697
> steyx(y, x)
[1] 2.254125
> trend(y, x, 6)
[1] 5.162162
> trend(y, x, 6, zero=TRUE)
[1] 5.546218
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI