i具有称为vec
(下图)的Vectorize
D功能。我的目标是能够获得该功能的输出列表。也就是说,当我运行该函数时,我将能够将函数调用作为对象(例如I
),然后通过使用I
的$
来子集,在这种情况下(以下是第一个运行函数vec
):
I = vec(L = .3, U = .6, level = seq(.5, .95, .1)) ; I$alpha ; I$beta
考虑到使用Vectorize
,这是否可以?(非常感谢您的专业知识)
这是R函数:
vec = Vectorize(function(L, U, level = .95){
p1 = (1 - level)/2
p2 = 1 - p1
f.beta <- function(alpha, beta, x, lower = 0, upper = 1){
p <- pbeta((x-lower)/(upper-lower), alpha, beta)
log(p/(1-p)) }
delta <- function(fit, actual) sum((fit-actual)^2)
objective <- function(theta, x, prob, ...) {
ab <- exp(theta)
fit <- f.beta(ab[1], ab[2], x, ...)
return (delta(fit, prob)) }
x.p <- (function(p) log(p/(1-p)))(c(p1, p2))
sol <- nlm(objective, log(c(1e1, 1e1)), x = c(L, U), prob = x.p, lower = 0, upper = 1, typsize = c(1, 1), fscale = 1e-12, gradtol = 1e-12)
parm <- as.numeric(exp(sol$estimate))
list(alpha = parm[[1]], beta = parm[[2]])
}, c("L", "U", "level"), SIMPLIFY = FALSE)
该函数已经矢量化,但是输出在list
中。因此,我们循环浏览list
元素以提取" alpha"one_answers" beta"组件
sapply(I, '[[', 'alpha')
#[1] 2.371449 3.562465 5.278213 7.939884 12.918233
sapply(I, '[[', 'beta')
#[1] 2.863406 4.336959 6.461091 9.757192 15.922938
请注意,输出可以简化为具有两个行的矩阵
simplify2array(I)
或两列matrix
do.call(rbind, I)