从2点在R中创建指数函数

问题描述

当仅给出直线经过的2个点时,我想在R中创建一个指数函数。我想使用基本的f(x)= ab ^ x格式。我了解如何通过创建两个方程式然后分别求解b和a来手动执行此操作,但是在用R编写此代码时遇到了问题。例如,当我尝试为变量分配另一个变量时,我在此过程的第一步中获取“找不到对象错误”。

x <- c(4,3,1.8,1.1,.6,.3,.02) 
y <- c(2,7,16,27,40,51,66)  
df <- data.frame(x,y)
a <- df$y[1]/b^df$x[1]

Error: object 'b' not found

我了解为什么会收到此错误,但我不知道如何解决。

我可以仅使用前两个点来创建指数模型,但是系数与实际数据值相差甚远。

expmod <- lm(log(df$y[1:2])~df$x[1:2])
exp(expmod$coefficients)

(Intercept)        df$x 
300.1250000   0.2857143

根据数据,截距应接近66(y = 66,x = 0.02时)

我最终希望能够使用此功能在一条线上获取两个点,然后绘制该线并根据其他x输入(即c(0,1,2,4))产生值,但是我很早就遇到麻烦了。

编辑:我不一定要从2点来创建模型并期待一个不错的预测。我正在尝试确定穿过两点的线的指数函数,类似于this,但是用R编码。(这条线不是完美的,因为它是由数据组成的。)

解决方法

未获得所需截距的原因是,数据框中的前两个点与其他点不在同一条指数曲线上。我们可以针对log(y)绘制x来看到这一点:

plot(x,log(y))

enter image description here

现在让我们仅使用前两个点(最右边的两个点)绘制回归

abline(lm(log(y) ~ x,data = df[1:2,]),col = "red")

enter image description here

并为其他5个点添加一行:

abline(lm(log(y) ~ x,data = df[-c(1:2),col = "blue")

enter image description here

您可以看到,如果仅使用两个点,则梯度和截距对与理想指数曲线的任何实验偏差都非常敏感。

这里有一个更大的观点,那就是,如果您尝试仅使用两个实验数据点进行预测,那么您的预测将不会非常准确。

相反,如果我们使用所有点,则可以对整个关系得到合理的预测:

plot(x,y)
lines(new_frame$x,new_frame$y,col = "red")

enter image description here

截距的数字预测更接近您的期望:

exp(lm(log(y) ~ x,data = df)$coef)
#> (Intercept)           x 
#>  68.2345853   0.4335491 

编辑

要从两个点“手动”计算方程,需要获取y值的对数,然后可以通过执行以下操作来计算两点之间的对数线的梯度:

gradient <- (log(y2) - log(y1)) / (x2 - x1)

,您可以通过为{em> intercept 解决y = gradient * x + intercept来获得拦截,即:

intercept <- log(y1) - gradient * x1

然后可以对梯度和截距求幂以找到原始线的系数。例如,使用此功能:

exp_line <- function(x1,x2,y1,y2) {
  gradient  <- (log(y2) - log(y1)) / (x2 - x1)
  intercept <- log(y1) - gradient * x1
  cat("y = ",exp(gradient),"^x * ",exp(intercept),"\n",sep = "")
}

我们得到

exp_line(x[1],x[2],y[1],y[2])
#> y = 0.2857143^x * 300.125

exp_line(x[4],x[5],y[4],y[5])
#> y = 0.455625^x * 64.10553

如果要在任意两点之间绘制指数曲线,可以执行以下操作:

draw_exp_line <- function(x1,y2,col) {
  gradient  <- (log(y2) - log(y1)) / (x2 - x1)
  intercept <- log(y1) - gradient * x1
  x <- seq(0,5,0.1)
  lines(x,exp(gradient)^x * exp(intercept),col = col)
}

plot(x,y)
draw_exp_line(x[2],x[1],y[2],"red")

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...