10

Rの二項比率の区間推定の範囲確率を計算する一般的な関数を作成しようとしています。これは、さまざまな事前分布のWald、Clopper-Pearson、HPD区間などのさまざまな信頼区間法で行う予定です。

理想的には、間隔を計算するために使用する必要があるメソッドを引数として取ることができる1つの関数が必要です。それでは私の質問:関数を引数として別の関数に含めるにはどうすればよいですか?

例として、Exact Clopper-Pearson間隔の場合、次の関数があります。

# Coverage for Exact interval
ExactCoverage <- function(n) {
p <- seq(0,1,.001)
x <- 0:n

# value of dist
dist <- sapply(p, dbinom, size=n, x=x)

# interval
int <- Exact(x,n)

# indicator function
ind <- sapply(p, function(x) cbind(int[,1] <= x & int[,2] >= x))

list(coverage = apply(ind*dist, 2, sum), p = p)
}

ここで、Exact(x、n)は、適切な間隔を計算するための関数にすぎません。私はを頂きたい

Coverage <- function(n, FUN, ...)
...
# interval
int <- FUN(...)

そのため、間隔計算の方法ごとに個別のカバレッジ関数ではなく、カバレッジ確率を計算するための1つの関数があります。これを行うための標準的な方法はありますか?説明が見つかりませんでした。

ありがとう、ジェームズ

4

3 に答える 3

16

Rでは、関数を関数の引数として指定できます。構文は、非関数オブジェクトの1つと一致します。

関数の例を次に示します。

myfun <- function(x, FUN) {
  FUN(x)
}

この関数は、関数FUNをオブジェクトに適用しますx

1から10までの数字を含むベクトルを使用したいくつかの例:

vec <- 1:10 

> myfun(vec, mean)
[1] 5.5
> myfun(vec, sum)
[1] 55
> myfun(vec, diff)
[1] 1 1 1 1 1 1 1 1 1

これは組み込み関数に限定されませんが、任意の関数で機能します。

> myfun(vec, function(obj) sum(obj) / length(obj))
[1] 5.5

mymean <- function(obj){
  sum(obj) / length(obj)
}
> myfun(vec, mymean)
[1] 5.5
于 2013-03-22T09:47:16.710 に答える
2

関数名を文字変数として格納し、do.call()を使用して呼び出すこともできます。

> test = c(1:5)
> do.call(mean, list(test))
[1] 3
> 
> func = 'mean'
> do.call(func, list(test))
[1] 3
于 2015-11-22T06:02:29.940 に答える
0

ハドリーのテキストは素晴らしい(そして単純な)例を示しています:

randomise <- function(f) f(runif(1e3))

randomise(mean)
#> [1] 0.5059199
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245
于 2020-07-03T10:33:11.763 に答える