在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'?
Edit2:由于我有更多的声誉,我现在可以发布更多关于我正在努力做的事情。让我的数据是:
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的整数:长度(y),增量为1.在Excel中:我可以简单地绘制这个并添加一个对数趋势线,结果如下:
黑色是原木。在R中,如何使用上述数据集进行此操作?
答案 0 :(得分: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))))
答案 1 :(得分:7)
您可以轻松指定其他平滑方法(例如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")
自动包含置信带:我改变了颜色以使它们可见,因为它们非常窄。您可以使用se=FALSE
中的stat_smooth
将其关闭。
另一个答案显示了如何获得系数:
coef(lm(success~log(horizon),data=dat))
我可以想象您接下来可能要将等式添加到图表中:请参阅Adding Regression Line Equation and R2 on graph
答案 2 :(得分:1)
我很确定一个简单的+ scale_y_log10()会得到你想要的东西。转换后计算GGPlot统计数据,然后根据对数转换数据计算loess()。
答案 3 :(得分:1)
我刚刚写了一篇blog post here来描述如何精确匹配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"))
希望有所帮助。