我无法计算,然后绘制多个积分。如果你能帮助我,那将是很棒的。
所以我有这个功能
> 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的新手,所以如果真的很容易,我已经很抱歉了。)
感谢您的帮助:)!
答案 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个向量A
和B
,则A+B
是A
和B
的逐个元素之和。几乎所有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