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

Made with Macintosh