簡體   English   中英

從 2 個點在 R 中創建指數函數

[英]Create exponential function in R from 2 points

當只給出直線通過的 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

我明白為什么我會收到這個錯誤,但我不知道解決方法。

我可以僅使用前 2 個點來創建指數模型,但系數與實際數據值相差甚遠。

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,3,4))生成值,但是我我很早就遇到了麻煩。

編輯:我不一定要嘗試從 2 點創建模型並期待一個很好的預測。 我正在嘗試確定通過兩點的直線的指數函數,類似於this ,但用 R 編碼。(這條線不會是完美的,因為它是由數據組成的。)

您沒有獲得所需截距的原因是數據框中的前兩個點與其他點不在同一指數曲線上。 我們可以通過對x繪制log(y)來看到這一點:

plot(x, log(y))

在此處輸入圖片說明

現在讓我們只使用前兩個點(最右邊的兩個點)繪制回歸

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

在此處輸入圖片說明

並為其他 5 個點添加一條線:

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

在此處輸入圖片說明

你可以看到,如果我們只使用兩個點,那么梯度和截距對任何與完美指數曲線的實驗偏差都非常敏感。

這里有一個更大的觀點,那就是如果您試圖僅使用兩個實驗數據點進行預測,那么您的預測將不會非常准確。

相反,如果我們使用所有的點,我們就可以對整個關系進行合理的預測:

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

在此處輸入圖片說明

截距的數值預測更接近你的預期:

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

編輯

要從兩點“手動”計算方程,您需要取 y 值的對數,然后您可以通過執行以下操作來計算兩點之間對數線的梯度:

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

並且您可以通過求解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, x2, y1, 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], y[1], "red")

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM