Я пытаюсь создать пользовательскую функцию панели LOESS для моего сюжета. В основном то, что он должен делать, это то же самое, что и простой panel.loess
или type = "smooth"
. Причина в том, что позже я хочу сделать это немного сложнее с вещами, которые нелегко достичь с помощью вышеизложенного. Однако он терпит неудачу.Добавление пользовательской панели LOESS в график решетки в R
Вот MWE (некоторые из них свободно на примере на странице 235 решетчатого книги Саркара:
library(lattice)
set.seed(9)
foo <- rexp(100)
bar <- rexp(100)
thing <- factor(rep(c("this", "that"), times = 50))
d.f <- data.frame(foo = foo, bar = bar, thing = thing)
loess.c <- function(x) {
mod <- loess(foo ~ bar, data = x)
return(mod)
}
panel.cloess <- function(x, n = 50, ...){
panel.xyplot(x, ...)
lfit <- loess.c(x)
xx <- do.breaks(range(x$x), n)
yy <- predict(lfit, newdata = data.frame(bar = xx),
se = TRUE)
print(yy) # doesn't do anything
panel.lines(x = xx, y = yy$fit, ...)
}
xyplot(foo ~ bar | thing, data = d.f,
panel = panel.cloess)
Результат таков:
Очевидно, что это ISN» я получаю следующее сообщение об ошибке: Error using packet n numeric 'envir' arg not of length one
. Мои попытки отладки (например, с использованием этого print(yy)
) тоже не работают, поэтому я понятия не имею, с чего начать искать решение.
Любые идеи о том, что вызывает это?
Да, это работает. Но я хочу, чтобы фактический лёссовый вызов был внешним по отношению к xyplot решетки, поскольку он будет использоваться и для других вещей. – Michael
Ну, вы можете извлечь код и использовать его как свой пост, но я не уверен в аргументах, которые вы использовали, и это кажется немного сложным, как вы это сделали. –
Теперь кажется сложным, но для этого он заслуживает внимания. Ваш ответ хорош, хотя - я не использовал аргументы ('x' и' y') правильно. Кажется, что 'x' и' y' являются фактическими координатами точек, тогда как я ошибочно считал, что 'x' - весь пакет. – Michael