Используя R, я написал функцию для исследовательского анализа данных, которая создает диаграмму рассеяния и аппроксимирует линию регрессии с помощью lm. Формула не фиксирована. Работает отлично, и я получаю оптимизированную формулу (my.results <- lm(fml, data); my.results$model
) и коэффициенты (my.results$coefficients
). Теперь я хочу продолжить и получить функцию, например. для нахождения нулей (т. е. там, где функция пересекает ось x и т. д.). Выполнение этого «вручную» для заданного результата lm
, очевидно, тривиально. Но есть ли способ построить эту функцию по результатам lm
(не зная заранее структуру формулы)? Спасибо за любые предложения!
создать функцию из формулы и коэффициентов регрессии
Ответы (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
predict.lm
внутри обратного решателя (например, в пакетахBB
илиktsolve
). Вам по-прежнему необходимо знать имена и количество независимых переменных в вашей модели, чтобы решатель знал, как перебиратьpredict.lm
. (Сейчас мне кто-нибудь подскажет, что есть методpolyroot.lm
или что-то в этом роде :-)) - person Carl Witthoft   schedule 04.06.2014