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