2015-09-05 5 views
0

Я бы хотел, чтобы регрессионная команда линейной модели «lm()» также добавила информацию о доверительном интервале.Измените функцию R, чтобы добавить дополнительный вывод?

В каком файле я должен быть modidy, чтобы получить его?

В худшем случае мне нужно будет перекомпилировать что-то, но я надеюсь, что смогу скомпилировать только один файл.

Что мне делать?

Другой вариант - создать скрипт, который запускается при запуске и перезаписывает обычное поведение или lm. Как?

+2

Вы можете использовать 'fixInNamespace (« lm »,« stats »)', но, вероятно, более безопасно и более портативно писать свою собственную функцию, добавляя все, что вы хотите для вывода lm, и используя 'res_lm <- lm (model) res_lm < - myfunc (res_lm) ' – scoa

+3

, если вы просто хотите видеть доверительный интервал с итоговым выходом, вы можете просто переопределить функцию print.lm:' print.lm <- function (x, ...) {print (summary (x)); cat («Доверительный интервал: \ n»); print (confint (x))} '; в противном случае вам придется написать оболочку для 'lm', которая вызывает' stats :: lm' и добавляет данные 'confint' в структуру' list', но при этом сохраняет класс 'lm'. Если вы не просто хотите использовать решение 'print.lm', предложение @ scoa не отменяет' lm' и делает вашу собственную функцию самым надежным и самым портативным. – hrbrmstr

+0

ОК, возможно, это переопределение, это плохая идея, потому что другие функции также могут быть затронуты. Идея @hrbrmsts звучит хорошо. Каков наилучший способ сделать его постоянным? Есть ли новые функции для будущих сессий R ?. В любом случае я хочу изменить несколько R-функций, чтобы имитировать вывод Sata, потому что мой босс, как они. – skan

ответ

3

То, что вы можете использовать, называется function operator. Функциональный оператор принимает функцию как входную, добавляет немного функциональности и возвращает функцию.

Например, чтобы создать версию lm что всегда сообщает о summary:

tweak_lm = function(modify_function) { 
    function(...) { 
     result = lm(...) 
     print(modify_function(result)) 
     result 
    } 
} 
summarized_lm = tweak_lm(summary) 
lm_res = summarized_lm(mpg ~ wt, mtcars) 

Call: 
lm(formula = ..1, data = ..2) 

Residuals: 
    Min  1Q Median  3Q  Max 
-4.5432 -2.3647 -0.1252 1.4096 6.8727 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 37.2851  1.8776 19.858 < 2e-16 *** 
wt   -5.3445  0.5591 -9.559 1.29e-10 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 3.046 on 30 degrees of freedom 
Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446 
F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10 

> lm_res 

Call: 
lm(formula = ..1, data = ..2) 

Coefficients: 
(Intercept)   wt 
    37.285  -5.344 

> 

Используя этот подход позволяет создавать другие варианты этого:

coef_lm = tweak_lm(coef) 
lm_res = coef_lm(mpg ~ wt, mtcars) 

(Intercept)   wt 
    37.285126 -5.344472 

Это не совсем ясно, что вам нужно, но вы можете использовать этот подход.

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