0

我有以下图像: 阴谋

我想平滑红线和蓝线。但我不知道该怎么做。红线和蓝线分别代表黑点的上下 95% 区间。(请注意,我没有使用任何回归公式来获得 95% 的区间)我阅读了有关 loess 函数的信息,但是当我尝试使用它时。我回到同样的情节。那么是否有任何特定的内置 R 函数可以让我平滑这两条线。

或者,有没有办法为这个问题获得“95% 的点间隔”

代码如下:

residual.plot <- function(a,b)
{
    log.y1 <- log(a) - b * log(energy)
    fitted.y <- exp(log.y1)
    diff <- count - fitted.y
    #normal approximation
    low.interval <- c()
    high.interval <- c()
    for(i in 1:350)
    {
        low <- diff[i] - sqrt(  exp(log(a) - b * log(energy[i])) )*qnorm(0.975)
        high <- diff[i] + sqrt(  exp(log(a) - b * log(energy[i]))  )*qnorm(0.975)
        low.interval <- append(low.interval, low)
        high.interval <- append(high.interval, high)
    }
    par(mfrow = c(1,1))
    plot(energy, diff, ylim = c(-10,10), type = "p", pch = 7)
    lines(energy, low.interval, type = "p", col = "red", pch = 1)
    lines(energy, high.interval, type = "p", col = "blue", pch = 1)


}
4

1 回答 1

5

首先,再也不敢发布这样的代码了。你犯了两个大罪:

  • 你在一个迭代循环中增长对象(那里有很多问题)
  • 您没有使用 R 工作矢量化的事实。

也就是说,最简单的方法是使用lowess,前提是您的数据中没有 NA 值。你的功能应该是这样的:

residual.plot <- function(a,b,count,energy)
{
    log.y1 <- log(a) - b * log(energy)
    fitted.y <- exp(log.y1)
    diff <- count - fitted.y

    #normal approximation
        low <- diff - sqrt(  exp(log(a) - b * log(energy)) )*qnorm(0.975)
        high <- diff + sqrt(  exp(log(a) - b * log(energy))  )*qnorm(0.975)

    par(mfrow = c(1,1))
    plot(energy, diff, ylim = c(-10,10), type = "p", pch = 7)
    lines(lowess(energy, low), type = "p", col = "red", pch = 1)
    lines(lowess(energy, high), type = "p", col = "blue", pch = 1)


}

PS:要使函数有用,您不应依赖函数外部的变量,例如countenergy。将它们作为参数添加到函数中,以便稍后在使用不同的数据集时使用该函数。

于 2012-12-21T17:26:14.663 回答