2015-06-09 3 views
2

Функция MASS::lm.gls подходит для линейной модели с использованием обобщенных наименьших квадратов и возвращает объект класса «lm.gls», но не имеет print , summary или другими методами.Написание обертки для функции линейного моделирования [MASS :: lm.gls()]

Я мог бы определить их просто угон методы для «лм» объекты

print.lm.gls <- function(object, ...) { 
    class(object) <- "lm" 
    print(object, ...) 
} 

summary.lm.gls <- function(object, ...) { 
    class(object) <- "lm" 
    summary(object, ...) 
} 

Вместо этого я попытался написать обертку для lm.gls, чтобы добавить «лм» в качестве другого класса. (Я понимаю, что это может быть опасно, потому что не все методы «lm» могут быть действительны для GLS.)

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

lm_gls <- function(formula, data, W, subset, na.action, inverse = FALSE, 
    method = "qr", model = FALSE, x = FALSE, y = FALSE, contrasts = NULL, 
    ...) 
{ 
    result <- MASS::lm.gls(formula, data, W, subset, na.action, 
     inverse = inverse, method = method, model = model, x = x, y = y, contrasts = contrasts, 
    ...) 
    class(result) <- c(class(result), "lm") 
    result 
} 

Тестовый пример:

library(vcd) # needs vcd_1.3-3+ 
data(Punishment, package="vcd") 

pun.lor <- loddsratio(Freq ~ memory + attitude + age + education, data = Punishment) 
pun.lor.df <- as.data.frame(pun.lor) 

library(MASS) 

pun.gls <- lm_gls(LOR ~ as.numeric(age) * as.numeric(education), data=pun.lor.df, 
        W=vcov(pun.lor), inverse=TRUE, x=TRUE, y=TRUE) 

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

> pun.gls <- lm_gls(LOR ~ as.numeric(age) * as.numeric(education), data=pun.lor.df, W=vcov(pun.lor), inverse=TRUE, x=TRUE, y=TRUE) 
Error in xj[i] : invalid subscript type 'closure' 

ответ

1

Ошибка вы получаете это либо из подмножества или na.action аргументы, которые не являются обязательными, но дон У меня есть значения по умолчанию. Следовательно, когда вы вызываете функцию без указания их, они передаются как они из оболочки, которая является закрытием типа. Самое простое решение - передать все в lm.gls в таких точках:

lm_gls <- function(...) 
{ 
    result <- MASS::lm.gls(...) 
    class(result) <- c(class(result), "lm") 
    result 
}