2015-08-02 3 views
0

Кто-нибудь знает о существующей функции для извлечения полного линейного уравнения из объекта lm?R: Автоматизация экстракции уравнения линейной регрессии от lm

Пусть у меня есть:

lm1 = lm(y~x1+x2...xn, data=df) 

Для этого курса в регрессии я везу, профессор неоднократно хочет полученное уравнение регрессии в виде: е (у) = b1 + b2x1 [...] BNX (п-1).

В настоящее время, я делаю что-то вроде этого:

(paste("y=", coef(lm1)[1], '+', coef(lm1[2]), '*x2', [...]) 

Он пронес в течение многих недель, как это. Не было бы огромной проблемой копировать и вставлять функцию вставки выше, но он хочет, чтобы вместо нее отображались фактические метки переменных вместо y, x1 и т. Д. Как вы можете видеть, моя рука и ум болят от многократного выполнения этого.

Я преодолел свой порог боли для этого, и сегодня начал думать о создании моей собственной функции для этого, но я просто проверяю, знает ли кто-нибудь о существующей функции, которая делает это автоматически.

Не думаю, что создать функцию, которая выполняет одну и ту же функцию вставки, кроме переменной длины для числа коэффициентов, будет чрезвычайно сложно, но это просто то, что я предпочел бы пойти с существующим решением, учитывая конечный продукт - такая бесполезная конструкция.

Примечание: это очень похоже, но не совсем тот же вопрос, поставленный здесь: Extract Formula From lm with Coefficients (R)

Почему он отличается? Эти вопросы касаются одного случая: «Как вы извлекаете уравнение линейной регрессии из объекта lm?» Этот вопрос заключается в том, что «существует ли существующий базовый метод или (если нет) метод для систематически, получающий уравнение линейной регрессии от объекта lm. Это особенно заметно, когда вы видите ответ, поставленный здесь, против принятого ответа на другая страница

+0

Смотрите здесь: http://stackoverflow.com/questions/21269793/extract-formula-from-lm-with -коэффициенты-r – Felix

+0

Спасибо, я видел это, но я подумал, что для этого должна существовать существующая встроенная функция. Наверное, мне просто нужно будет изменить тот, чтобы получить тот, который может корректировать правильное количество предикторов. – nordicray

+0

Фактически, код в связанном столбце SO автоматически настраивается на количество предикторов. – Felix

ответ

0

Мой наивный подход к этой проблеме также должен был бы настроить свою собственную функцию, используя paste0():..

regEq <- function(lmObj, dig) { 
    paste0("y = ", 
     paste0(
      c(round(lmObj$coef[1], dig), round(sign(lmObj$coef[-1])*lmObj$coef[-1], dig)), 
      c("", rep("*", length(lmObj$coef)-1)), 
      paste0(c("", names(lmObj$coef)[-1]), c(ifelse(sign(lmObj$coef)[-1]==1," + "," - "), "")), 
      collapse="" 
     ) 
    ) 
} 

, где он получает немного грязный из-за признаков и перехватывать Давайте посмотрим на простой вызов :

> fit <- lm(-mpg ~ cyl + hp + drat, data=mtcars) 
> fit 

Call: 
lm(formula = -mpg ~ cyl + hp + drat, data = mtcars) 

Coefficients: 
(Intercept)   cyl   hp   drat 
    -22.51406  1.36060  0.02878  -2.84090 

> regEq(fit,3) 
[1] "y = -22.514 + 1.361*cyl + 0.029*hp - 2.841*drat" 

EDIT: по запросу. комментарий: Для того, чтобы заменить y с именем переменной и изменить оператор взаимодействия с * переписывания:

regEq <- function(lmObj, dig) { 
    gsub(":", "*", 
     paste0(
      names(lmObj$model)[1]," = ", 
      paste0(
       c(round(lmObj$coef[1], dig), round(sign(lmObj$coef[-1])*lmObj$coef[-1], dig)), 
       c("", rep("*", length(lmObj$coef)-1)), 
       paste0(c("", names(lmObj$coef)[-1]), c(ifelse(sign(lmObj$coef)[-1]==1," + "," - "), "")), 
       collapse="" 
      ) 
     ) 
    ) 
} 

> regEq(lm(mpg ~ hp * drat, data=mtcars), 3) 
[1] "mpg = 5.55 - 0.013*hp + 6.069*drat - 0.01*hp*drat" 
+0

Это работает! Я не понимаю, почему это работает. Похоже, что с -1 вы получите последний коэффициент в lmobject, но он ведет себя что-то похожее на цикл i в (1: length (lm_object)), над которым я работал.Я пытаюсь разобрать ваше решение, чтобы я мог (потенциально) модифицировать для интерактивных терминов. Он заменил бы «x1: x2» на x1 * x2. Также изучая модификацию так, чтобы фактическое имя переменной y отображалось в уравнении вместо просто «y». Обе точки довольно тривиальны, но это довольно тривиальный класс .... – nordicray

+0

@nordicray должен был сделать некоторые работы вокруг с перехватом, вот почему [-1]. Разделите внутри 'paste', если вы хотите это понять. Также сделал редактирование по. ваш комментарий. –

+0

Еще раз спасибо! Я возглавил гораздо более обременительный путь. Я собирался заменить «y =» на вызов функции другой функции, обнаруженной при переполнении стека: getResponse <- function (formula) { tt <- terms (formula) vars <- as.character (attr (tt, «переменные»)) [- 1] ## [1] - вызов списка ответ <- attr (tt, «response») # индекс ответа var vars [response]} Я сделал довольно много искал попытку извлечь переменную y и использовал str (lm_object) около 20 раз, но не смог добраться до него. Я понятия не имел, что это в $ model. – nordicray

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