読者です 読者をやめる 読者になる 読者になる

DISTRICT 37

なにか

Rで近似曲線を描く

R

EXCELとかで出す近似曲線を描いた

準備

気温のプロットと、それの近似曲線を描くことを目標にします。

気象庁|過去の気象データ・ダウンロード

気象庁から5/1のとある地点のデータを持ってきます。データの内容はこんな感じで「kion_20160501.csv」という名前にして任意の場所に保存。

時刻 気温
2016-05-01 00:00 13.9
2016-05-01 01:00 13.9
2016-05-01 02:00 12.3

読み込む際に1列目をPOSIXct2列目をnumericとして読み込みます

kion = read.csv("kion_20160501.csv", header = T, colClasses = c("POSIXct", "numeric"))

まずはプロット

g = ggplot(kion, aes(1:nrow(kion), temp)) + geom_line(colour="blue") + labs(title="2016/05/01")
plot(g)


お昼に向かって気温が高くなり、夕方に向けて気温が下がっていくのが見て取れる f:id:dragstarclassic:20160518125038j:plain

近似曲線を描く

こんなデータの近似曲線は三次関数で表せます。

{ \displaystyle
y = ax{^3} + bx{^2} + cx + d
}

Rではnls関数を使うことで、変数a, b, c, dを算出できる。

x = 1:nrow(kion)
y = kion[,2]

kinji = nls(y ~ a * x^3 + b * x^2 + c * x + d, start=c(a=0, b=0, c=0, d=0))
summary(kinji)

# Formula: y ~ a * x^3 + b * x^2 + c * x + d
#
# Parameters:
#    Estimate Std. Error t value Pr(>|t|)    
# a -0.009287   0.001626  -5.710 1.38e-05 ***
# b  0.285935   0.061774   4.629 0.000162 ***
# c -1.640390   0.671806  -2.442 0.024033 *  
# d 14.627075   1.979598   7.389 3.89e-07 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 2.056 on 20 degrees of freedom
#
# Number of iterations to convergence: 1 
# Achieved convergence tolerance: 6.516e-08

これで係数が出たので、プロットする。

a = -0.009
b =  0.228
c = -1.640
d = 14.627

近似曲線のプロット

predict関数でベクトルをとれます。

predict.c = predict(kinji)

ggplotでplotするためベクトルをdata.frameにしておきます

kd = data.frame(predict.c)
kd$num = 1:nrow(kion)

プロットするとこんな感じ

g = ggplot(kion, aes(1:nrow(kion), temp)) + geom_line(colour="blue") + labs(title="2016/05/01")
k = geom_line(aes(kd$num, kd$predict.c), colour="red")
a = annotate("text", label= "y = -0.009 * x^3 + 0.285 * x^2 - 1.64 * x + 14.62", x=7, y=25, col="red")
plot(g + k + a)


f:id:dragstarclassic:20160518132329j:plain

これで近似曲線が描けた。フィットしているようなしていないような、、、

おソースはこちら