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