2015-03-12 4 views
1

Я пытаюсь создать пользовательскую функцию панели 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) 

Результат таков:

R output

Очевидно, что это ISN» я получаю следующее сообщение об ошибке: Error using packet n numeric 'envir' arg not of length one. Мои попытки отладки (например, с использованием этого print(yy)) тоже не работают, поэтому я понятия не имею, с чего начать искать решение.

Любые идеи о том, что вызывает это?

ответ

1

после некоторых (небольших) изменений, я использовал этот скрипт

xyplot(foo ~ bar | thing, data = d.f, panel = function(x,y){ 
    xx <- do.breaks(range(x), 49) 
    mod <- loess(y~x) 
    yy <- predict(mod, newdata = data.frame(foo=xx)) 
    panel.xyplot(x,y) 
    panel.lines(x=xx, y= yy) 
}) 

Я изменил количество очков, потому что было некоторое предупреждающее сообщение. Это работает, и это то, чего вы ожидали?

+0

Да, это работает. Но я хочу, чтобы фактический лёссовый вызов был внешним по отношению к xyplot решетки, поскольку он будет использоваться и для других вещей. – Michael

+0

Ну, вы можете извлечь код и использовать его как свой пост, но я не уверен в аргументах, которые вы использовали, и это кажется немного сложным, как вы это сделали. –

+1

Теперь кажется сложным, но для этого он заслуживает внимания. Ваш ответ хорош, хотя - я не использовал аргументы ('x' и' y') правильно. Кажется, что 'x' и' y' являются фактическими координатами точек, тогда как я ошибочно считал, что 'x' - весь пакет. – Michael

Смежные вопросы