r - 功率回归中stat_smooth和lm(使用log)之间的R差异?
问题描述
我有一些数据:
library(ggplot2)
x <-c(2600248.25,1303899.14285714,1370136.33333333,353105.857142857, 145446.952380952,299032,75142.2631578947,40381.1818181818,6133.93103448276,975.234567901235,779.341463414634)
y <- c(4,7,6,14,21,9,19,22,29,81,41)
我试图对此进行回归和绘图。我的问题是我想进行回归并根据我的数据绘制它,但是当我在对数值上使用 lm 时,预测和绘制与 stat_smooth 相比,我得到了一些不同的结果。考虑代码:
fit0 <- lm(log(y) ~ log(x))
summary(fit0)
newx <- x
lm.fit <- predict(fit0, newdata = data.frame(x=newx), interval = "confidence")
df <- as.data.frame(cbind(x,y,lm.fit))
p <- ggplot(df, aes(x,y)) + geom_point() + geom_smooth(method = "lm", formula ="y~x") + scale_x_log10() + scale_y_log10()
p <- p + geom_line(aes(y=fit)) # result too low
p <- p + geom_line(aes(y=10^fit)) # result too high
如所见,我已经尝试过使用日志结果并使用 10^x 转换回来。照原样,两个线性模型应该显示相同的值吗?这里有什么问题,我如何获得正确的值?
(我的最终目标是能够绘制预测区间)
解决方案
您使用log10
scale onggplot
但log
进行计算。在 R 中,仅使用log()
意味着您使用的是自然对数。当您改为使用时,您会发现和log10()
没有区别。由于只是调用例程,因此预期输出相同。geom_smooth
lm
ggplot
lm
library(ggplot2)
x <-c(2600248.25,1303899.14285714,1370136.33333333,353105.857142857, 145446.952380952,299032,75142.2631578947,40381.1818181818,6133.93103448276,975.234567901235,779.341463414634)
y <- c(4,7,6,14,21,9,19,22,29,81,41)
fit0 <- lm(log10(y) ~ log10(x))
summary(fit0)
newx <- x
fit <- predict(fit0, newdata = data.frame(x=newx), interval = "confidence")
df <- as.data.frame(cbind(x,y))
p <- ggplot(df, aes(x,y)) + geom_point() + geom_smooth(method = "lm", formula ="y~x") + scale_x_log10() + scale_y_log10()
p <- p + geom_line(aes(y=10^fit[,1]))
p
有关详细信息,请查看文档。
log
计算对数,默认情况下为自然对数,log10
计算常用(即以 10 为底)对数,并log2
计算二进制(即以 2 为底)对数。一般形式log(x, base)
计算以底为底的对数。
推荐阅读
- react-native - 标题空白和 ImageBackground
- apache-kafka-streams - kafka 流中的聚合和状态存储保留
- php - 使用 php 和 htaccess 创建人造 dyndns
- c# - Unity - 如何制作有弹性的绳索?
- ios - uipagecontrol 当前不动
- python - `functools.partial` 的不同行为
- ios - iOS 中的呼叫目录扩展如何更新
- python - 如何在递归中保留价值
- python-3.x - 如何在 spyder 中运行我的代码,就像我以前在 linux 终端中运行它一样
- matlab - 为什么稀疏密集乘法比密集稀疏乘法快?