Примерка лессовой линии в R

У меня возникли проблемы с использованием loess() а также predict() в R. Я использовал следующий код для моделирования данных:

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")

Извиняюсь, но я не могу понять, как прикрепить картинку, чтобы показать, как это выглядит!

Последние две строки кода заканчиваются просто добавлением случайной черной линии наполовину от графика, хотя, когда я ранее использовал эту команду для разных (очень похожих) данных, казалось, что она работает нормально. Что мне не хватает?! Любая помощь была бы отличной, спасибо:)

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"))
  })
Другие вопросы по тегам