создать функцию из формулы и коэффициентов регрессии

Используя R, я написал функцию для исследовательского анализа данных, которая создает диаграмму рассеяния и аппроксимирует линию регрессии с помощью lm. Формула не фиксирована. Работает отлично, и я получаю оптимизированную формулу (my.results <- lm(fml, data); my.results$model) и коэффициенты (my.results$coefficients). Теперь я хочу продолжить и получить функцию, например. для нахождения нулей (т. е. там, где функция пересекает ось x и т. д.). Выполнение этого «вручную» для заданного результата lm, очевидно, тривиально. Но есть ли способ построить эту функцию по результатам lm (не зная заранее структуру формулы)? Спасибо за любые предложения!


person Martin    schedule 04.06.2014    source источник
comment
Я думаю, что это можно сделать с помощью predict.lm внутри обратного решателя (например, в пакетах BB или ktsolve). Вам по-прежнему необходимо знать имена и количество независимых переменных в вашей модели, чтобы решатель знал, как перебирать predict.lm . (Сейчас мне кто-нибудь подскажет, что есть метод polyroot.lm или что-то в этом роде :-))   -  person Carl Witthoft    schedule 04.06.2014
comment
Извините, я пока не могу проголосовать, но спасибо за все 3 предложения.   -  person Martin    schedule 05.06.2014


Ответы (2)


Пример:

set.seed(42)

x <- 1:100
y <- (x-2)*(x-15)*(x-90) + rnorm(100)

fit <- lm(y~poly(x, degree=3, raw=TRUE))

Если ваша подгонка является многочленом, вы можете легко найти все корни:

polyroot(coef(fit))
#[1]  1.999364-0i 15.000010-0i 89.999991+0i

Если это произвольная функция, линейная по своим коэффициентам, можно найти корни численно:

invLm <- function(x, mod.lm) predict(mod.lm, newdata=list(x=x))

uniroot(invLm, c(-100, 100), mod.lm=fit)
#$root
#[1] 89.99999
person Roland    schedule 04.06.2014

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

genFun1 <- function(model) {
    xvname <- all.vars( delete.response( terms( model ) ) )
    function(...) {
        newdat <- data.frame(...)
        names(newdat) <- xvname
        predict(model, newdat)
    }
}

x <- 1:10
y <- 2*x - 5 + rnorm(10)

fit1 <- lm( y ~ x )
fit2 <- lm( y ~ sqrt(x) + I(x^3) )

len <- x
adjmas <- y

fit3 <- lm( adjmas ~ len )

pred1 <- genFun1(fit1)
pred2 <- genFun1(fit2)
pred3 <- genFun1(fit3)

plot(x,y)
xx <- seq(0,10, length.out=25)
lines( xx, pred1(xx), col='red' )
lines( xx, pred2(xx), col='green' )
lines( xx, pred3(xx), col='blue')
person Greg Snow    schedule 04.06.2014