2012-02-14 3 views
3

Я хочу, чтобы переопределить функцию по умолчанию predict.lm из-за ошибки:Как переопределить функцию S3 по умолчанию в R?

library(datasets) 
# Just a regular linear regression 
fit <- lm(mpg~disp+hp+wt+drat, data=mtcars) 
termplot(fit, terms=2, se=T) 

дает эту ошибку:

Error in predict.lm(model, type = "terms", se.fit = se, terms = terms) : 
    subscript out of bounds 

Я знаю, где ошибка есть, и я послал по электронной почте, что ждет одобрение основного списка рассылки, но в то же время я хотел бы проверить свою собственную функцию expect.lm, чтобы исправить это. Я понял, что мне нужно переопределить функцию S3 для предсказать, но при выполнении этого кода:

setMethod("predict", "lm", predict.lm2) 
getMethod("predict", "lm") 

getMethod возвращает свою новую функцию, как и ожидалось, но termplot все еще работает старая функция. methods("predict") также показывает, что старый файл прогноза.lm все еще существует, и я думаю, что это может быть порядок звонков или что-то, что мне нужно настроить. Кто-нибудь знаком с тем, как это сделать?

+0

Вы можете попробовать установить класс своей модели. 'class (fit) <- c (" lm2 "," lm ")' – James

+0

Затем он жалуется на отсутствие определения для класса lm2. –

+0

. Вы не работаете с S3, а с S4 при использовании setMethod. Это может вызвать проблемы. –

ответ

4

@ комментарий Джеймс предлагает определить свой собственный lm2 класс, который расширяет lm и реализовать predict.lm2.

class(fit) <- c("lm2", class(fit)) 
predict.lm2 <- function(...) { 
    # The function with your bugfix 
    cat("Inside predict.lm2\n") 
    predict.lm(...) 
} 
termplot(fit, terms=2, se=T) 
+0

Спасибо, это почти решает проблему, хотя моя исправленная ошибка функция expect.lm2 вызывает незначительную ошибку: не удалось найти функцию «qr.lm» - я думаю, это связано с некоторой внутренней функцией класса lm. Как получить доступ к внутренним функциям lm? Я наклеил свою функцию predict.lm2 [здесь, на pastebin] (http://pastebin.com/FARH1gC0) –

+2

Поскольку функция не экспортируется, вам необходимо явно указать пространство имен: 'stats ::: qr.lm' , каждый раз, когда он появляется. –

+0

Спасибо, это сработало как шарм –