计算给定的 Lambda
Calculate Lambda given
我正在使用 R 并尝试计算未知的 lambda。已知是泊松分布中的一个区域。
x <- cbind("q" = rpois(n = 4, lambda = 3), "ppois" = runif(n = 4), "lambda_unknown" = rep(NA, times = 4))
x
# q ppois lambda_unknown
# [1,] 4 0.05207818 NA
# [2,] 5 0.61127960 NA
# [3,] 3 0.83317758 NA
# [4,] 4 0.94495935 NA
我想要一个可以帮助我计算未知 lambda 的函数,所以 "ppois" =ppois(q = q, "lambda_unknown")
期望的(大致)输出:
x
# q ppois lambda_unknown
# [1,] 4 0.05 ~9.15
# [2,] 5 0.61 ~5.02
# [3,] 3 0.83 ~1.4
# [4,] 4 0.94 ~2.05
以最后一行为例:
ppois(4, 2.05)
# [1] 0.9427231
不幸的是,我不认为有一个内置函数,但我们可以很容易地编写一个函数来使用数字方法。
例如使用二分法,我们可以做到
approx<-function(q,p,epsilon) {
lower<-0
upper<-1
while(ppois(q,upper)>p) {upper<-upper*2}
while (upper-lower>epsilon) {
middle<-(upper+lower)/2
if (ppois(q,middle)<p) {upper<-middle}
else {lower<-middle}
}
return ((upper+lower)/2)
}
此函数将找到 lambda 的近似值,它会导致 p 在某个所需 epsilon 内(实际上在 epsilon/2 内)具有所需 q 的概率。为了使用它,我们必须使用 ppois 函数在 lambda 区间 [0,infinity) 上单调递减的事实。如果函数是单调递增的,它仍然可以通过修改工作,但是在我们的解决方案附近需要单调性才能使二分法工作。
使用这个
approx(4,0.05,0.01) # 9.152344
approx(5,0.61,0.01) # 5.035156
approx(3,0.83,0.01) # 2.144531
approx(4,0.94,0.01) # 2.082031
有关二分法的更多信息,请参见here。其他数值方法速度更快,但更难编码。
为了用所需的值替换 lambda_unknown 列,我们可以像这样使用应用函数:
x[,"lambda_unknown"]<-apply(x,1,function(z){approx(z["q"],z["ppois"],0.01)})
这会将内联函数应用于矩阵 x 的每一行(1 表示按行应用,2 表示按列应用)。内联函数获取给定的行并计算从该行输入正确参数的近似函数。
我正在使用 R 并尝试计算未知的 lambda。已知是泊松分布中的一个区域。
x <- cbind("q" = rpois(n = 4, lambda = 3), "ppois" = runif(n = 4), "lambda_unknown" = rep(NA, times = 4))
x
# q ppois lambda_unknown
# [1,] 4 0.05207818 NA
# [2,] 5 0.61127960 NA
# [3,] 3 0.83317758 NA
# [4,] 4 0.94495935 NA
我想要一个可以帮助我计算未知 lambda 的函数,所以 "ppois" =ppois(q = q, "lambda_unknown")
期望的(大致)输出:
x
# q ppois lambda_unknown
# [1,] 4 0.05 ~9.15
# [2,] 5 0.61 ~5.02
# [3,] 3 0.83 ~1.4
# [4,] 4 0.94 ~2.05
以最后一行为例:
ppois(4, 2.05)
# [1] 0.9427231
不幸的是,我不认为有一个内置函数,但我们可以很容易地编写一个函数来使用数字方法。
例如使用二分法,我们可以做到
approx<-function(q,p,epsilon) {
lower<-0
upper<-1
while(ppois(q,upper)>p) {upper<-upper*2}
while (upper-lower>epsilon) {
middle<-(upper+lower)/2
if (ppois(q,middle)<p) {upper<-middle}
else {lower<-middle}
}
return ((upper+lower)/2)
}
此函数将找到 lambda 的近似值,它会导致 p 在某个所需 epsilon 内(实际上在 epsilon/2 内)具有所需 q 的概率。为了使用它,我们必须使用 ppois 函数在 lambda 区间 [0,infinity) 上单调递减的事实。如果函数是单调递增的,它仍然可以通过修改工作,但是在我们的解决方案附近需要单调性才能使二分法工作。
使用这个
approx(4,0.05,0.01) # 9.152344
approx(5,0.61,0.01) # 5.035156
approx(3,0.83,0.01) # 2.144531
approx(4,0.94,0.01) # 2.082031
有关二分法的更多信息,请参见here。其他数值方法速度更快,但更难编码。
为了用所需的值替换 lambda_unknown 列,我们可以像这样使用应用函数:
x[,"lambda_unknown"]<-apply(x,1,function(z){approx(z["q"],z["ppois"],0.01)})
这会将内联函数应用于矩阵 x 的每一行(1 表示按行应用,2 表示按列应用)。内联函数获取给定的行并计算从该行输入正确参数的近似函数。