1

私はRを初めて使用し、非線形モデルを一部のデータに適合させようとしましたが、失敗しました。最後に、Excel に多項式トレンドラインを追加し、取得した関数をプロットしようとしました。何らかの理由で関数が R のデータに適合しません。単純な geom_smooth を試しましたが、「かさばる」線が得られました。滑らかなもの。1 つのプロットに 6 つのサンプルがあります。Excel で取得した関数とそれをプロットしようとした試みを含む、そのうちの 1 つのデータを次に示します。より良い方法があると確信しています-出力でフィットの関数も取得する必要があります。

datax <- c(0, 21.3, 30, 46.3, 72)
datay <- c(0, 0.008723333, 0.016253333, 0.039896667, 0.079893333)
data <- data.frame(datax, datay)
x <- seq(0, 0.01, length.out = 72)
poly.fit <- function(x) 1E-5*x^2+0.0002*x
ggplot(data, aes(x=datax, y=datay)) +
  geom_point() +
  stat_function(fun=poly.fit)
4

1 に答える 1

3

まあ、その関数はデータに完全には適合しません。コードを実行すると、そうでないpoly.fit(46.3)ものが返されます0.0306969.03989

問題は方程式自体にあります。R でデータに完全に一致する関数を作成したい場合は、多項式補間と呼ばれる原則があり、完全に適合させるには、モデル内の項と同じ数の点が必要であるとほぼ述べています。したがって、ポイントを一致させたい場合は、次を使用できます。

 m <- lm(datay ~ poly(datax,4))   # poly() fits the polynomial with 4+1 terms
 summary(m)                       # displays coefficients

係数を取得したら、以前と同じように関数を再作成できます。これは、ポイントに完全に一致するように線に適合するはずです (十分な多項式の項に適合する限り!)。

編集:これは、必要なものを表示する再現可能なコードの例です

library(ggplot2)
datax <- c(0, 21.3, 30, 46.3, 72)
datay <- c(0, 0.008723333, 0.016253333, 0.039896667, 0.079893333)
data <- data.frame(datax, datay)

# This is another approach to the fitting using I()
m <- lm(datay ~ datax + I(datax^2) + I(datax^3) + I(datax^4))

x <- seq(0, 72, by = .1)
poly.fit = function(x){       
    as.numeric(m$coefficients[1]) +
    as.numeric(m$coefficients[2])*x +
    as.numeric(m$coefficients[3])*x^2 + 
    as.numeric(m$coefficients[4])*x^3 + 
    as.numeric(m$coefficients[5])*x^4
}  #This way you dont have to copy and paste coefficients

ggplot(data, aes(x=datax, y=datay)) +
  geom_point() +
  stat_function(fun=poly.fit)
于 2016-03-22T16:40:49.750 に答える