目的 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 解説ページ