OPが式から報告している答えを正確に得ていないので、代わりにExcelの同等の一連の直接置換関数を作成し、それらをRで使用する方法のサンプルを作成しました。これは最も効率的な方法ではありませんR用ですが、OPが実装に向けて動く最も便利な方法かもしれません。
CRITBINOM : これは基本的にカウント関数です。二項試行のサイズ、成功の確率、およびアルファ値が必要です。累積確率が指定されたアルファ値よりも大きい最小のサンプル サイズを返します。
CRITBINOM <- function(.trials, .probability_s, .alpha){
i <- 0
while(sum(dbinom(0:i, .trials, .probability_s)) < .alpha){
i <- i + 1
print(i)
}
return(i)
}
BINOMDIST : Excel では、これは実際にはブール スイッチを持つ 2 つの関数です。スイッチが TRUE の場合、関数は、指定された試行サイズと成功確率に基づいて、指定された数の二項成功の左側累積分布値を返します。スイッチが false の場合、関数は、同じ情報が与えられた確率質量関数 (正確な数の成功の確率) を返します。
BINOMDIST <- function(.number_s, .trials, .probability_s, .cumulative){
if(.cumulative){
return(sum(dbinom(0:.number_s, .trials, .probability_s)))
}else{
return(choose(.trials,.number_s)*.probability_s^.number_s*(1-.probability_s)^(.trials-.number_s))
}
}
ISERROR : この場合、関数は実際には、関数の結果が無限 (未定義) であるかどうかを確認するだけです。このような特定の用途のために Excel のすべての機能を複製するつもりはありません。
ISERROR <- function(.value){
return(is.infinite(.value))
}
ROUNDDOWN : これは、奇妙な小さな Excel 関数の 1 つです。丸めますが、切り捨てるだけです。この場合、10^ 桁を掛けて余りを取り除き、10^ 桁で割ることによって数値を切り捨てているほど、実際には四捨五入していません。
ROUNDDOWN <- function(.number, .num_digits){
num_digits <- as.integer(.num_digits)
return(as.integer(.number*10^num_digits)/(10^num_digits))
}
R コードの例: このすべてを使用して、OP の Excel タスクを複製する方法を示します。まず、ベクトル化された関数を定義して、'n' 値を一度に計算します。
n <- function(.start, .increments, .B){
return(.start + ROUNDDOWN(.increments * exp(1)^.B, 0))
}
次に、単一の低アラート値を決定する関数を作成します。これは、OP の作業のほとんどが組み込まれている場所です。関数はほぼ同じに見えるはずです。
generate_Low_Alert <- function(.n, .probability_s, .alpha){
critB <- CRITBINOM(.n, .probability_s, .alpha)
Low_adj <- critB-(BINOMDIST(critB, .n, .probability_s,TRUE)-.alpha)/(BINOMDIST(critB, .n, .probability_s,TRUE)-BINOMDIST(critB-1, .n, .probability_s,TRUE))
if(ISERROR(100 * Low_adj / .n)){
return("")
}else{
return(Low_adj/.n)
}
}
最後に、混乱全体を処理するためのラッパーを作成します。
generate_data <- function(.B, .probability_s, .alpha, .start, .increments){
Low_Alerts <- integer(length(.increments))
n_values <- n(.start, .increments, .B)
for(i in 1:length(n_values)){
Low_Alerts[i] <- generate_Low_Alert(n_values[i], .probability_s, .alpha)
}
return(Low_Alerts)
}
基本的には、「n」個の値のそれぞれをループして、アラート (「」または Low_adj/n の値) を生成するだけです。これらすべてが 1 つの配列に格納され、関数の結果として返されます。
すべてを使用するには、次のようにラッパー関数を呼び出します。
generate_data(1.7, 0.01, 0.005, 1, 0:100)
ここで、これは Excel のアプローチとは少し異なります。一度に 1 つずつではなく、最初に一連のステップ全体 (0:100) を定義するからです。それ以外の場合、これは私が作成した Excel バージョンを正確に複製します。
免責事項:OPと同じ結果を得ることができませんでした(14ではなくx_axis = 97でアラートを見ました)が、Excel関数とこれらの置換関数の数学は正確でなければなりません。うまくいけば、この作業を自分のニーズに適応させることができます。幸運を!