3

我想计算与向量中每个值相关联的函数的积分。用一个例子,我准确地描述了我的目标如下。

假设xy是独立随机变量,并且I是指示变量,例如I=1ify > 0.25xzeroelse。我想n从指数分布中绘制 y,并且对于每次绘制,我希望计算 ,g = xf(x)I的分布上x的积分f(x)。我希望这个分布是指数的,参数值为 1。我在r.

f = function(n){
  h = list()
  g = numeric()
  y = rexp(n)
  for(i in 1:n){
    h[i] = function(x){(x * dexp(x) * (y[i] > 0.5*x))}
    g[i] = integrate(h[i], lower=-Inf, upper=Inf)
  }
  return(summary(g))
}

但是当我运行 f(3) 时,我收到一条错误消息 " *Error in h[i] = function(x) { : cannot coerce type 'closure' to vector of type 'list'"*。但是当我运行以下代码时

y = rexp(1)
h = function(x){x * dexp(x) * (y > 0.5*x)}
integrate(h, lower=-Inf, upper=Inf)
f(3)

我得到结果。有人对如何改进此代码提出建议,以便在输出为 a 的h每个值处评估函数,然后将其传递给函数?yfunctiong

4

2 回答 2

1

您需要使用[[to 子集h而不是[. 这是因为[将返回子列表而不是内容。还integrate返回一个复杂的结构,如果您只想要该值,请附加$value以选择它。

f = function(n){
  h = list()
  g = numeric()
  y = rexp(n)
  for(i in 1:n){
    h[[i]] = function(x){(x * dexp(x) * (y[i] > 0.5*x))}
    g[i] = integrate(h[[i]], lower=-Inf, upper=Inf)$value
  }
  return(summary(g))
}

f(3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2456  0.3269  0.4082  0.4069  0.4876  0.5669 
于 2013-11-11T12:53:15.620 回答
1

我建议使用sapply而不是循环:

f = function(n){
  y = rexp(n)
  g = sapply(1:n, function(i) 
                  integrate(function(x) (x * dexp(x) * (y[i] > 0.5*x)), lower=-Inf, upper=Inf))
  return(summary(g))
}
于 2013-11-11T11:57:00.920 回答