【问题标题】:Managing output of a Vectorized function in R在 R 中管理向量化函数的输出
【发布时间】:2017-12-14 04:05:56
【问题描述】:

我有一个名为vecVectorized 函数(如下)。我的目标是能够获得一个可子集列表作为此函数的输出。也就是说,当我运行该函数时,我将能够将函数调用保存为一个对象(例如,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)

【问题讨论】:

  • 是你想要循环的level,即lapply( seq(.5, .95, .1), vec, L = .3, U = .6)
  • 如果我查看代码,只有 level 的长度大于 1
  • 长度大于1时是相同的还是不同的。也许你需要expand.grid(L, U, level)
  • 那么,在这种情况下,如果我使用 expand.grid 正确,您可能需要获取所有组合?
  • 基于函数,你已经得到了一个输出,但唯一的问题是它在 list 所以,sapply(I, '[[', 'alpha')# [1] 2.371449 3.562465 5.278213 7.939884 12.918233 和类似的'beta',即sapply(I, '[[', 'beta')# [1] 2.863406 4.336959 6.461091 9.757192 15.922938 我猜是你问的,对吧?

标签: r function output vectorization


【解决方案1】:

函数已经向量化,但输出在list 中。因此,我们循环遍历 list 元素以提取 'alpha' 和 '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)

【讨论】:

  • @morouzian 函数本身正在提供输出。如果你检查参数,你给了SIMPLIFY = FALSE。所以,它保留了list 结构
  • @morouzian 因为输出已经在list 中。 Vectorize 的一个问题是,由于它的输出方式,很难将其包装在函数中
  • @morouzian 如果只有 'alpha' 和 'beta' 值,那么只需unlist 并提取它,即unlist(I)[c(TRUE, FALSE)] 或者如果你想要两列输出do.call(rbind, I)simplify2array(I)
猜你喜欢
  • 2020-02-03
  • 2016-03-02
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多