2

我在 R 中使用loess()and时遇到了一些问题predict()。我使用以下代码来模拟数据:

Overall=0.6
RR=1.1
Noise=0.05

x=seq(from=0.01, to=10, by=0.01) 
logRR=log(RR)
logBeta0=log(Overall)


linear.pred = logBeta0 + (logRR*x) + rnorm(length(x), 0, Noise*sqrt(x))
linear.pred.high = logBeta0 + (logRR*15) + rnorm(length(x), 0, Noise/5)

PoissonRate <- function (x) ifelse(x<=9, exp(linear.pred), exp(linear.pred.high))

xyplot(PoissonRate(x)~x) #the shape of the 'raw' data


loess_fit <- loess(x~PoissonRate(x))
lines(predict(loess_fit), col = "black")

抱歉,但我不知道如何附上图片来展示它的样子!

最后两行代码最终只是在图表的一半处添加了一条随机黑线,尽管当我之前在不同(非常相似的)数据上使用此命令时,它似乎工作正常。我错过了什么?!任何帮助都会很棒,谢谢:)

4

1 回答 1

1

至少在我看来,你不应该在通话之外打电话llines()(如果这是你的意思lines()) 。有:xyplot?llines

Description:

     These functions are intended to replace common low level
     traditional graphics functions, primarily for use in panel
     functions.

因此,一种选择是按照它的建议进行操作并即时构建您自己的面板功能。这是一个例子:

set.seed(1)
dat <- data.frame(pr = PoissonRate(x), x = x)
loess_fit <- loess(pr ~ x, data = dat)

xyplot(PoissonRate(x) ~ x,
  panel = function(x, y, ...) {
    panel.xyplot(x, y, ...)
    llines(dat$x, predict(loess_fit), col.line = "red")
  })

产生:

在此处输入图像描述

一般来说,我可能会以不同的方式来做这件事——我会在公式之外生成数据。我希望predict新数据位置均匀分布在x. 这样,即使输入数据不是按递增顺序排列的,x您也可以获得可用于线图的合理预测。例如

## following on from the above
pred <- with(dat, data.frame(x = seq(min(x), max(x), length = 100)))
pred <- transform(pred, pr = predict(loess_fit, newdata = x))

xyplot(PoissonRate(x) ~ x,
  panel = function(x, y, ...) {
    panel.xyplot(x, y, ...)
    with(pred, llines(x, pr, col.line = "red"))
  })
于 2013-03-27T17:56:54.170 回答