绘制 lm 返回的模型的结果
Plot results from the model returned by lm
很抱歉,如果这是微不足道的,还没有找到解决方案。
为简单起见,我有 5 个点(例如 d0 = c(1,2,3,4,5)
)和 5 个值(例如 f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
)。
我想概括这个并找到一个函数 f
使得 f(d0) = f0
。很简单。为此,如果我做对了,我需要反复试验才能找到 f
的正确结构;然后我可以用 lm
提取它的参数。对吗?
所以,我开始尝试简单的线性模型:
model <- lm(f0 ~ d0)$coefficients
然后我想绘制它以查看实际拟合:
lines(d0, model[[1]] + d0*model[[2]])
问题
尝试其他类型的依赖项时,事情会变得无聊。比如我可以猜出两者之间的一个log日志依赖关系:
model <- lm(log(f0) ~ log(d0))$coefficients
但是为了绘制真正的函数,我需要将对行的调用更改为
lines(d0, exp(model2[[1]] + model2[[2]]*log(d0)))
现在,如果我要尝试另一种公式,我将不得不为 lines
使用不同的代码行。
问题
- 有没有办法自动绘制
lm
的结果(以lines(d0, predicted.f)
的形式),也许使用lm$call
中的信息?
我的愿望是这样的:
model <- lm(f0 ~ d0)
plotFromModel(d0, model)
model <- lm(log(f0) ~ log(d0))
plotFromModel(d0, model)
- 这里有我遗漏的东西吗?这个简单的任务应该用
lm
和不同的公式来完成还是有更明显的路径?
编辑
看起来没有更明显的路径了。我在这里澄清一下,这个问题是出于为这 5 个点找到最合适的 1d 曲线的必要性。因此,当我们被迫使用 lm
时,我们必须对各种公式持开放态度,例如
f0 ~ d0
log(f0) ~ d0
f0 ~ d0 + I(log(d0)^2)
等等。最重要的是,我仍在寻找一维函数,即 y = f(x)
其中 x 和 y 都是标量并且不涉及其他参数。
曲线拟合问题的其他典型要求是,一旦从 5 个点找到模型,就可以看到它的真实曲线(-> 使用任意长度的 d),然后可以进行比较与您正在测试的其他模型。我想复制以下行为:
d0 <- c(1,2,3,4,5)
f0 <- c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
d <- seq(from = 1, to = 5, length.out = 200)
windows(w=700,h=500)
plot(d0, f0, type='b',col='black', log='xy',lwd=4)
grid()
m <- lm(f0 ~ d0)$coefficients
lines(d, m[1] + m[2]*d, col='orange', lwd=3)
m <- lm(log(f0) ~ log(d0))$coefficients
lines(d, exp(m[1] + m[2]*log(d)), col='blue', lwd=3)
m <- lm(log(f0) ~ log(log(d0)))$coefficients
lines(d, exp(m[1] + m[2]*log(log(d))), col='green', lwd=3)
m <- lm(log(f0) ~ log(d0) + I(log(d0)^2))$coefficients
lines(d, exp(m[1] + m[2]*log(d) + m[3]*log(d)^2), col='red', lwd=3)
m <- lm(f0 ~ d0 + I(d0^2))$coefficients
lines(d, m[1] + m[2]*d + m[3]*d^2, col='pink', lwd=3)
由此可见红色为佳
从下面的好答案来看,这证明是非常重要的,所以就我个人而言,我将坚持使用手动方法。这应该是可能的,因为公式保存在 model$call
中,但我可以没有它。
您可以使用预测将模型应用于您的数据。这是一个例子:
d0 = c(1,2,3,4,5)
f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
model <- lm(f0 ~ d0)
plot(d0, f0)
lines(d0, predict(model, data.frame(d0 = d0)))
也许有比创建数据框作为 predict 的参数更优雅的方法,但它至少应该是一个足够的解决方案。
plotFromModel
假设模型具有可能转换的 y
值和单个 x
值;但是,x
值可以包含在多个 lm
项中,并且每个项都可以转换 x
。 finv
必须指定 LHS 的逆变换(如果 y
不进行变换,则可以省略)。如果 add
为 FALSE(默认值),它绘制 y
与 x
,然后拟合。如果 add
为 TRUE,它只会绘制覆盖任何现有图的拟合。 ... 传递给绘制拟合的 lines
命令。请注意,它会重新拟合模型。
此外,请注意,使用传统的线性回归测试无法比较不同的拟合,因为它们使用的是 y
.[ 的不同函数的平方和=26=]
plotFromModel <- function(x, fm, finv = identity, add = FALSE, ...) {
# DF's columns are y and x
DF <- cbind(finv(fm$model[1]), x)
names(DF) <- all.vars(terms(fm))
if (!add) plot(DF[2:1]) # plot y vs. x
fm.new <- lm(terms(fm), DF) # refit using new x
lines(finv(fitted(fm.new)) ~ x, ...)
}
d0 = c(1,2,3,4,5)
f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
fm0 <- lm(f0 ~ d0)
fm1 <- lm(log(f0) ~ log(d0))
fm2 <- lm(log(f0) ~ log(d0) + I(log(d0)^2))
fm3 <- lm(f0 ~ d0 + I(d0^2))
plotFromModel(d0, fm0, col = 1)
plotFromModel(d0, fm1, exp, add = TRUE, col = 2, lty = 2)
plotFromModel(d0, fm2, exp, add = TRUE, col = 3, lty = 3)
plotFromModel(d0, fm3, add = TRUE, col = 4, lty = 4)
很抱歉,如果这是微不足道的,还没有找到解决方案。
为简单起见,我有 5 个点(例如 d0 = c(1,2,3,4,5)
)和 5 个值(例如 f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
)。
我想概括这个并找到一个函数 f
使得 f(d0) = f0
。很简单。为此,如果我做对了,我需要反复试验才能找到 f
的正确结构;然后我可以用 lm
提取它的参数。对吗?
所以,我开始尝试简单的线性模型:
model <- lm(f0 ~ d0)$coefficients
然后我想绘制它以查看实际拟合:
lines(d0, model[[1]] + d0*model[[2]])
问题
尝试其他类型的依赖项时,事情会变得无聊。比如我可以猜出两者之间的一个log日志依赖关系:
model <- lm(log(f0) ~ log(d0))$coefficients
但是为了绘制真正的函数,我需要将对行的调用更改为
lines(d0, exp(model2[[1]] + model2[[2]]*log(d0)))
现在,如果我要尝试另一种公式,我将不得不为 lines
使用不同的代码行。
问题
- 有没有办法自动绘制
lm
的结果(以lines(d0, predicted.f)
的形式),也许使用lm$call
中的信息?
我的愿望是这样的:
model <- lm(f0 ~ d0)
plotFromModel(d0, model)
model <- lm(log(f0) ~ log(d0))
plotFromModel(d0, model)
- 这里有我遗漏的东西吗?这个简单的任务应该用
lm
和不同的公式来完成还是有更明显的路径?
编辑
看起来没有更明显的路径了。我在这里澄清一下,这个问题是出于为这 5 个点找到最合适的 1d 曲线的必要性。因此,当我们被迫使用 lm
时,我们必须对各种公式持开放态度,例如
f0 ~ d0
log(f0) ~ d0
f0 ~ d0 + I(log(d0)^2)
等等。最重要的是,我仍在寻找一维函数,即 y = f(x)
其中 x 和 y 都是标量并且不涉及其他参数。
曲线拟合问题的其他典型要求是,一旦从 5 个点找到模型,就可以看到它的真实曲线(-> 使用任意长度的 d),然后可以进行比较与您正在测试的其他模型。我想复制以下行为:
d0 <- c(1,2,3,4,5)
f0 <- c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
d <- seq(from = 1, to = 5, length.out = 200)
windows(w=700,h=500)
plot(d0, f0, type='b',col='black', log='xy',lwd=4)
grid()
m <- lm(f0 ~ d0)$coefficients
lines(d, m[1] + m[2]*d, col='orange', lwd=3)
m <- lm(log(f0) ~ log(d0))$coefficients
lines(d, exp(m[1] + m[2]*log(d)), col='blue', lwd=3)
m <- lm(log(f0) ~ log(log(d0)))$coefficients
lines(d, exp(m[1] + m[2]*log(log(d))), col='green', lwd=3)
m <- lm(log(f0) ~ log(d0) + I(log(d0)^2))$coefficients
lines(d, exp(m[1] + m[2]*log(d) + m[3]*log(d)^2), col='red', lwd=3)
m <- lm(f0 ~ d0 + I(d0^2))$coefficients
lines(d, m[1] + m[2]*d + m[3]*d^2, col='pink', lwd=3)
从下面的好答案来看,这证明是非常重要的,所以就我个人而言,我将坚持使用手动方法。这应该是可能的,因为公式保存在 model$call
中,但我可以没有它。
您可以使用预测将模型应用于您的数据。这是一个例子:
d0 = c(1,2,3,4,5)
f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
model <- lm(f0 ~ d0)
plot(d0, f0)
lines(d0, predict(model, data.frame(d0 = d0)))
也许有比创建数据框作为 predict 的参数更优雅的方法,但它至少应该是一个足够的解决方案。
plotFromModel
假设模型具有可能转换的 y
值和单个 x
值;但是,x
值可以包含在多个 lm
项中,并且每个项都可以转换 x
。 finv
必须指定 LHS 的逆变换(如果 y
不进行变换,则可以省略)。如果 add
为 FALSE(默认值),它绘制 y
与 x
,然后拟合。如果 add
为 TRUE,它只会绘制覆盖任何现有图的拟合。 ... 传递给绘制拟合的 lines
命令。请注意,它会重新拟合模型。
此外,请注意,使用传统的线性回归测试无法比较不同的拟合,因为它们使用的是 y
.[ 的不同函数的平方和=26=]
plotFromModel <- function(x, fm, finv = identity, add = FALSE, ...) {
# DF's columns are y and x
DF <- cbind(finv(fm$model[1]), x)
names(DF) <- all.vars(terms(fm))
if (!add) plot(DF[2:1]) # plot y vs. x
fm.new <- lm(terms(fm), DF) # refit using new x
lines(finv(fitted(fm.new)) ~ x, ...)
}
d0 = c(1,2,3,4,5)
f0 = c(0.8950514, 1.240066, 1.410252, 1.494778, 1.514794)
fm0 <- lm(f0 ~ d0)
fm1 <- lm(log(f0) ~ log(d0))
fm2 <- lm(log(f0) ~ log(d0) + I(log(d0)^2))
fm3 <- lm(f0 ~ d0 + I(d0^2))
plotFromModel(d0, fm0, col = 1)
plotFromModel(d0, fm1, exp, add = TRUE, col = 2, lty = 2)
plotFromModel(d0, fm2, exp, add = TRUE, col = 3, lty = 3)
plotFromModel(d0, fm3, add = TRUE, col = 4, lty = 4)