在散点图中添加对数回归线(与Excel比较)

8
在Excel中,很容易拟合给定趋势线的对数趋势线。只需单击添加趋势线,然后选择“对数”。但是,如果想要更强大的功能,则需要切换到R,但不确定应该使用哪个函数来生成它。
为了生成图形,我使用了ggplot2和以下代码。
ggplot(data, aes(horizon, success)) + geom_line() + geom_area(alpha=0.3)+
  stat_smooth(method='loess')

但是该代码执行的是基于多个小线性回归的平均化的局部多项式回归拟合。我的问题是是否在R中有类似Excel中使用的对数趋势线。

我正在寻找的另一种选择是得到形如y = (c*ln(x))+b的对数方程;是否有coef()函数来获取'c'和'b'?

假设我的数据如下:

c(0.599885189,0.588404133,0.577784156,0.567164179,0.556257176,
0.545350172,0.535112897,0.52449292,0.51540375,0.507271336,0.499904325,
0.498851894,0.498851894,0.497321087,0.4964600,0.495885955,0.494068121,
0.492154612,0.490145427,0.486892461,0.482395714,0.477229238,0.471010333)

上述数据是y轴上的点,而x轴上的点仅是从1:length(y)以1为增量的整数。在Excel中:我可以简单地绘制这个图形并添加一个对数趋势线,结果如下所示:enter image description here黑色表示对数。在R中,如何使用上述数据集完成此操作?

1
您可以使用log()函数对数据取对数,并使用loess()函数拟合平滑器。使用plot()绘制数据图,并使用lines()添加(平滑)线条。 - guest
有没有可能只获取方程式呢?在Excel中的方程式是y=(c*ln(x))+b。 - user1234440
4个回答

11

我更喜欢使用基础图形而不是ggplot2

#some data with a linear model
x <- 1:20
set.seed(1)
y <- 3*log(x)+5+rnorm(20)

#plot data
plot(y~x)

#fit log model
fit <- lm(y~log(x))
#look at result and statistics
summary(fit)
#extract coefficients only
coef(fit)

#plot fit with confidence band
matlines(x=seq(from=1,to=20,length.out=1000),
         y=predict(fit,newdata=list(x=seq(from=1,to=20,length.out=1000)),
                   interval="confidence"))

在此输入图片描述

#some data with a non-linear model
set.seed(1)
y <- log(0.1*x)+rnorm(20,sd=0.1)

#plot data
plot(y~x)

#fit log model
fit <- nls(y~log(a*x),start=list(a=0.2))
#look at result and statistics
summary(fit)

#plot fit
lines(seq(from=1,to=20,length.out=1000),
      predict(fit,newdata=list(x=seq(from=1,to=20,length.out=1000))))

8

您可以轻松地指定替代平滑方法(例如 lm(),线性最小二乘拟合)和替代公式。

library(ggplot2)
g0 <- ggplot(dat, aes(horizon, success)) + geom_line() + geom_area(alpha=0.3)
g0 + stat_smooth(method="lm",formula=y~log(x),fill="red")

置信区间自动包含在内:我改变了颜色使其可见,因为它们非常窄。您可以在stat_smooth中使用se=FALSE来关闭它们。
另一个答案向您展示如何获取系数:
coef(lm(success~log(horizon),data=dat))

我能想象你接下来可能想要将方程式添加到图表中:请参阅在图表上添加回归线方程和R2


你在使用geom_line之外,为什么还要使用geom_area?我不确定它是否使图形易于理解。 - mnel
我从原帖的示例中复制了它:我以为他们把它放在那里是因为他们想要它,但我猜可能他们只是从一个示例中复制了它... - Ben Bolker

1
我刚刚写了一篇博客文章, 描述了如何完全匹配Excel的对数曲线拟合。方法的核心在于lm()函数。
# Set x and data.to.fit to the independent and dependent variables
data.to.fit <- c(0.5998,0.5884,0.5777,0.5671,0.5562,0.5453,0.5351,0.524,0.515,0.5072,0.4999,0.4988,0.4988,0.4973,0.49,0.4958,0.4940,0.4921,0.4901,0.4868,0.4823,0.4772,0.4710)
x <- c(seq(1, length(data.to.fit)))
data.set <- data.frame(x, data.to.fit)

# Perform a logarithmic fit to the data set
log.fit <- lm(data.to.fit~log(x), data=data.set)

# Print out the intercept, log(x) parameters, R-squared values, etc.
summary(log.fit)

# Plot the original data set
plot(data.set)

# Add the log.fit line with confidence intervals
matlines(predict(log.fit, data.frame(x=x), interval="confidence"))

希望这有所帮助。

1
我相信一个简单的+scale_y_log10()就可以得到你想要的结果。GGPlot统计数据是在转换之后计算的,因此loess()将在对数转换后的数据上进行计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接