计算多个积分并绘制它们(用R)

时间:2014-03-08 19:54:54

标签: r integrate

我无法计算,然后绘制多个积分。如果你能帮助我,那将是很棒的。

所以我有这个功能

> f = function(x, mu = 30, s = 12){dnorm(x, mu, s)}

我希望在z(1:100)和+ Inf之间整合多个时间来绘制x = z和y = auc:

> auc = Integrate(f, z, Inf)

R return:

Warning message:
In if (is.finite(lower)) { :
  the condition has length > 1 and only the first element will be used

我已经测试过循环:

while(z < 100){
z = 1
auc = integrate(f,z,Inf)
z = z+1}

也不起作用......不知道该怎么做

(我是R的新手,所以如果真的很容易,我已经很抱歉了。)

感谢您的帮助:)!

2 个答案:

答案 0 :(得分:4)

无需手动进行整合。 pnorm给出从负无穷大到正常密度输入的积分。您可以通过修改lower.tail参数来获取上部尾部

z <- 1:100
y <- pnorm(z, mean = 30, sd = 12, lower.tail = FALSE)
plot(z, y)

如果您正在寻找集成更复杂的函数,那么使用integrate将是必要的 - 但如果您只是想要找到分布的概率,那么很可能会内置一个函数来进行集成直接为你服务。

答案 1 :(得分:2)

你的问题实际上有点微妙,在某种意义上说到了R的工作原理,所以这里有一个稍长的解释。

R是一种“矢量化”语言,这意味着几乎所有东西都适用于矢量。如果我有2个向量AB,则A+BAB的逐个元素之和。几乎所有R函数也都以这种方式工作。如果X是向量,则Y <- exp(X)也是一个向量,其中Y的每个元素都是X的对应元素的指数。

函数integrate(...)是R中少数几个矢量化的函数之一。所以当你写:

f   <- function(x, mu = 30, s = 12){dnorm(x, mu, s)}
auc <- integrate(f, z, Inf)

integrate(...)函数是向量时,它不知道如何处理z。所以它需要第一个元素并抱怨。因此警告信息。

R中有一个特殊函数Vectorize(...),它将标量函数转换为向量函数。你会这样使用它:

f   <- function(x, mu = 30, s = 12){dnorm(x, mu, s)}
auc <- Vectorize(function(z) integrate(f,z,Inf)$value)
z   <- 1:100
plot(z,auc(z), type="l")   # plot lines