【问题标题】:geom_smooth and exponential fitsgeom_smooth 和指数拟合
【发布时间】:2016-09-16 16:18:05
【问题描述】:

我是 R 新手,我在使用 ggplot2 绘制指数曲线时遇到了一些困难。我下面有一组数据。

数据

               X        Y         x        y
1  0.6168111 37.20637 0.6168111 37.20637
2  0.5478698 24.17084 0.5478698 24.17084
3  0.6082697 26.21261 0.6082697 26.21261
4  0.6094899 26.14065 0.6094899 26.14065
5  0.6095040 38.56314 0.6095040 38.56314
6  0.6933108 36.78443 0.6933108 36.78443
7  0.5796637 27.82840 0.5796637 27.82840
8  0.4716866 30.63080 0.4716866 30.63080
9  0.5291792 29.78255 0.5291792 29.78255
10 1.2520000 33.12657 1.2520000 33.12657
11 1.2260000 31.81066 1.2260000 31.81066
12 1.2690000 59.91388 1.2690000 59.91388
13 1.2060000 49.92380 1.2060000 49.92380
14 1.0760000 29.67524 1.0760000 29.67524
15 0.9750000 27.43602 0.9750000 27.43602
16 1.1470000 35.34598 1.1470000 35.34598
17 1.1080000 32.75476 1.1080000 32.75476
18 0.8854048 26.20000 0.8854048 26.20000
19 0.8965901 31.80000 0.8965901 31.80000
20 0.6240262 31.50000 0.6240262 31.50000
21 0.7968513 40.20000 0.7968513 40.20000
22 0.8635455 30.90000 0.8635455 30.90000
23 0.7414680 31.50000 0.7414680 31.50000
24 0.8701420 30.80000 0.8701420 30.80000
25 0.7312760 28.90000 0.7312760 28.90000
26 1.7313667 49.70000 1.7313667 49.70000
27 1.5730064 35.00000 1.5730064 35.00000
28 2.0033461 33.10000 2.0033461 33.10000
29 1.4110183 34.90000 1.4110183 34.90000
30 1.5826836 50.50000 1.5826836 50.50000
31 1.8019046 39.80000 1.8019046 39.80000
32 1.4689220 33.30000 1.4689220 33.30000
33 1.7568460 33.10000 1.7568460 33.10000
34 1.4727440 37.90000 1.4727440 37.90000
35 0.8225826 24.90000 0.8225826 24.90000
36 0.6625028 32.30000 0.6625028 32.30000
37 0.5410429 30.10000 0.5410429 30.10000
38 0.7322787 28.70000 0.7322787 28.70000
39 0.6586351 29.80000 0.6586351 29.80000
40 0.3003746 29.70000 0.3003746 29.70000
41 0.3351484 25.10000 0.3351484 25.10000
42 0.3254572 24.20000 0.3254572 24.20000
43 0.3818777 24.90000 0.3818777 24.90000
44 0.3153609 30.10000 0.3153609 30.10000

当我用几个不同的模型拟合这些数据时,模型 log(y) ~ x 根据 P 值的比较提供了最佳拟合。

代码

linear.model <-lm(y ~ x, df)
log.model <-lm(log(y) ~ x, df)
exp.model <-lm(y ~ exp(x), df)

我想用 ggplot 和 geom_smooth 绘制这个数据和这个拟合。

testPlot <- ggplot(df, aes(x=x, y=y)) + 
  geom_point() +
  geom_smooth(method="lm", formula= (y ~ exp(x)), se=FALSE, color=1) +
  geom_smooth(method="lm", formula= (log(y) ~ x), se=FALSE, color=2)

使用 (y ~ exp(x) 模型绘制的线(黑线)看起来是正确的,但使用 (log(y) ~ x) 并没有给我预期的结果(红线)。我怎样才能覆盖log(y) ~ x 模型的行正确吗?

【问题讨论】:

  • 为什么说它没有给出预期的结果?情节对我来说似乎还可以..
  • 我同意。您正在使用压缩您的 y 范围的 log(y)。您可以通过以下方式看到这一点:testPlot &lt;- ggplot(df, aes(x=x, y=y)) + geom_smooth(method="lm", formula= (log(y) ~ x), se=FALSE, color=2)。您的 log(y) 仅从大约 3.3 变为 3.8。也许您想在第二个轴上绘制它?
  • 感谢 cmets。 exp.model 中描述的拟合方程是 y = 2.59e^x + 25.8,这通过geom_smooth(method="lm", formula= (y ~ exp(x)), se=FALSE, color=1) 忠实地绘制出来。 log.model 描述的方程是 y = 25.53e^(.26x)。这就是我希望使用命令geom_smooth(method="lm", formula= (log(y) ~ x), se=FALSE, color=2) 在绘图上显示的内容。如何将 y = 25.53e^(.26x) 描述的线覆盖在数据点之上?

标签: r plot ggplot2 curve-fitting exponential


【解决方案1】:

正如 cmets 中正确提到的,log(y) 的范围是 3.19 - 4.09。我认为您只需要将拟合值恢复到与 y 相同的比例,所以试试这个。希望对您有所帮助...

library(ggplot2)

df <- read.csv("test.csv")

linear.model <-lm(y ~ x, df)
log.model <-lm(log(y) ~ x, df)
exp.model <-lm(y ~ exp(x), df)

log.model.df <- data.frame(x = df$x,
                           y = exp(fitted(log.model)))

ggplot(df, aes(x=x, y=y)) + 
  geom_point() +
  geom_smooth(method="lm", aes(color="Exp Model"), formula= (y ~ exp(x)), se=FALSE, linetype = 1) +
  geom_line(data = log.model.df, aes(x, y, color = "Log Model"), size = 1, linetype = 2) + 
  guides(color = guide_legend("Model Type"))

【讨论】:

  • 为什么两个型号不一样? y~exp(x)exp(log(y)~x)不一样吗?
  • 你可以看看这个例子here
  • @HolgerBrandl 函数形式相同,但最小二乘的权重不同,因此您会得到不同的结果。
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多