Excel にある一変量統計関数     Last modified: Jun 28, 2004

目的

Excel にある一変量統計関数を R で定義する

使用法

avedev(x)	# 平均偏差
average(x)	# 算術平均
count(x)	# 有効データ数
devsq(x)	# 偏差平方和
geomean(x)	# 幾何平均
harmean(x)	# 調和平均
stdev(x)	# 標準偏差
stdevp(x)	# 母標準偏差
varp(x)		# 母分散
skew(x, method=c("Excel", "ordinary"))	# 歪度
kurt(x, method=c("Excel", "ordinary"))	# 尖度
trimmean(x, p)	# トリム平均
large(x, k)	# 大きい方からk番目の数値
small(x, k)	# 小さい方からk番目の数値

引数

avedev 〜 varp の引数はデータベクトルまたはマトリクス
skew, kurtの第一引数は上に同じ,第二引数はExcelかordinaryのいずれか。省略されたときは Excel が指示されたことになる
trimmean の第一引数は上に同じ,第二引数は上下から除くデータの割合(0から1までの値)
large の第一引数は上に同じ,第二引数は大きい方から何番目かを表す整数値
small の第一引数は上に同じ,第二引数は小さい方から何番目かを表す整数値

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/univariate.R", encoding="euc-jp")

# 馬鹿馬鹿しいが,Excel にある関数を R で定義してみる
avedev <- function(x)
{
        x <- x[!is.na(x)]
        mean(abs(x-mean(x)))                            # 算術平均値からの偏差の絶対値の算術平均値
}

average <- mean      # 単に名前の違い

count <- length      # 単に名前の違い

devsq <- function(x)
{
        x <- x[!is.na(x)]
        (length(x)-1)*var(x)                            # 平方和は不偏分散から元に戻す
}

geomean <- function(x)
{
        x <- x[!is.na(x)]
        ifelse(all(x > 0), exp(mean(log(x))), NA)       # データは全部正の値でなくてはならない。戻り値は,対数値の平均値の逆対数(指数)
}

harmean <- function(x)
{
        x <- x[!is.na(x)]
        ifelse(all(x > 0), 1/mean(1/x), NA)             # データは全部正の値でなくてはならない。戻り値は,逆数の平均値の逆数
}

my.sum <- function(x)                                        # 大きさの違う数を足し算するときには若干の注意が必要(あまり効果はない)
{
        x <- x[!is.na(x)]
        sum(x[order(abs(x))])
}

skew <- function(x, method = c("Excel", "ordinary"))
{
        method <- match.arg(method)                  # 省略可能なパラメータの処理。標準は Excel(SPSS) と同じ計算法
        x <- x[!is.na(x)]                            # 欠損値を持つケースを除く
        n <- length(x)                                       # データ数
        if (method == "Excel") {                        # Excel(SPSS)と同じ計算法
                n*my.sum(scale(x)^3)/(n-1)/(n-2)        # scale は元のデータを標準化する関数
        }
        else {
                my.sum(((x-mean(x))/sqrt((n-1)*var(x)/n))^3)/n  # 標準化は分散の平方根を取った標準偏差による
        }
}

kurt <- function(x, method = c("Excel", "ordinary"))
{
        method <- match.arg(method)                  # 省略可能なパラメータの処理。標準は Excel(SPSS) と同じ計算法
        x <- x[!is.na(x)]                            # 欠損値を持つケースを除く
        n <- length(x)                                       # データ数
        if (method == "Excel") {                        # Excel(SPSS)と同じ計算法
                n*(n+1)*sum(scale(x)^4)/(n-1)/(n-2)/(n-3)-3*(n-1)^2/(n-2)/(n-3) # scale は元のデータを標準化する関数
        }
        else {
                sum(((x-mean(x))/sqrt((n-1)*var(x)/n))^4)/n-3   # 標準化は分散の平方根を取った標準偏差による
        }
}

stdev <- sd                                          # 単に名前の違い

stdevp <- function(x)
{
        x <- x[!is.na(x)]                            # 欠損値を持つケースを除く
        n <- length(x)                                       # データ数
        sd(x)*sqrt((n-1)/n)                             # 分散の平方根により定義される標準偏差
}

trimmean <- function(x, p)
{
        mean(x, p/2, na.rm=TRUE)
}

varp <- function(x)
{
        x <- x[!is.na(x)]                            # 欠損値を持つケースを除く
        n <- length(x)                                       # データ数
        (n-1)*var(x)/n                                  # 不偏分散から分散を求める
}

large <- function(x, k)
{
        rev(sort(x[!is.na(x)]))[k]                      # 大きい方からk番目の数値
}

small <- function(x, k)
{
        sort(x[!is.na(x)])[k]                           # 小さい方からk番目の数値
}

fact <- factorial                                    # 名前の違い

combin <- choose                                     # 名前の違い


使用データ例

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

使用例と出力結果例

> avedev(x)
[1] 2.5
> average(x)
[1] 5.5
> count(x)
[1] 10
> devsq(x)
[1] 82.5
> geomean(x)
[1] 4.528729
> harmean(x)
[1] 3.414172
> stdev(x)
[1] 3.027650
> varp(x)
[1] 8.25
> skew(x)			# 第二パラメータが省略されたときは Excel(SPSS)と同じ計算方法による
[1] 0
> skew(x, method="Excel")		# Excel(SPSS)の歪度の計算方法による
[1] 0
> skew(x, method="ordinary")	# 通常の歪度の計算方法による
[1] 0
> kurt(x)			# 第二パラメータが省略されたときは Excel(SPSS)と同じ計算方法による
[1] -1.2
> kurt(x, method="Excel")		# Excel(SPSS)の尖度の計算方法による
[1] -1.2
> kurt(x, method="ordinary")	# 通常の尖度の計算方法による
[1] -1.224242
> trimmean(x, 0.2)		# 上下から20%のデータを除いて算術平均値を取る
[1] 5.5
> large(x, 3)
[1] 8
> small(x, 4)
[1] 4
> fact <- factorial # 名前の違い
> fact(9)	# 階乗 (統計関数ではないが,ときどき使われるので)
[1] 362880
> combin <- choose # 名前の違い
> combin(8, 3) # 組み合わせ (統計関数ではないが,ときどき使われるので)
[1] 56
・ 解説ページ


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh