从公式和回归系数创建函数

时间:2014-06-04 16:18:56

标签: r formulas

使用R,我编写了一个用于探索性数据分析的函数,该函数生成散点图并使用lm拟合回归线。公式不固定。完美的工作,我得到优化的公式(my.results <- lm(fml, data); my.results$model)和系数(my.results$coefficients)。现在我想继续并获得功能,例如用于找到零(即函数穿过x轴的位置等)。对于给定的lm结果“手动”执行此操作显然是微不足道的。但是有没有办法从lm结果构建这个函数(事先不知道公式的结构)?谢谢你的任何建议!

2 个答案:

答案 0 :(得分:3)

一个例子:

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

答案 1 :(得分:0)

这是一个选项,它将计算拟合中预测变量的名称,并创建一个函数(使用预测)来计算预测值。您需要确保以正确的顺序传递正确数量的变量(如果只有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')