我正在對我的電費進行一些分析,并試圖提取空調單元的使用量。通過假設“正常”用電量在一年中相當穩定,并且空調僅在較熱的月份打開,我能夠估計出一些分離。
圖中有兩行:
- 線性顯示“正常使用”,累積
- 顯示 AC 使用的 S 型曲線,累積
在試圖通過這種總累積使用來擬合一個好的模型時,R 中的 nls 函式在初始引數估計時給出了可怕的奇異梯度矩陣。使用不同的軟體 (JMP) 我可以獲得良好的初始引數,這些引數反映在紫色擬合曲線中。
知道如何使用 R 來獲得引數估計而不會出現錯誤嗎?
模型
nls(elec_use_mean ~ b0 b1 * month a1 / (a2 a3 * exp(a4 * month)),
start = list(b0 = 100, b1 = 310, a1 = 1300, a2 = 0.3, a3 = 600, a4 = -1.2),
data = cumulative
)
Error in nlsModel(formula, mf, start, wts, scaleOffset = scOff, nDcentral = nDcntr) :
singular gradient matrix at initial parameter estimates
資料:
month,elec_use_mean
1,461.46
2,839.46
3,1197.92
4,1553.59
5,2093.34
6,3096.42
7,4353.67
8,5652.51
9,6729.84
10,7296.92
11,7634.34
12,8071.84
下面是一張圖片

uj5u.com熱心網友回復:
引數化 sigmoid 曲線的另一種方法是使用tanh,它可以生成一個很好的收斂模型,只有 4 個引數而不是 6 個引數。公式也可以這樣寫,使引數具有明確的含義接近初步估計:
elec_use_mean ~ b1 * month 6 * b0 * (1 tanh(a1 * (month - a0)))
在哪里:
- b0是一年中平均每月空調支出
- b1是一年中的平均每月背景用電量
- a0是一年中空調使用率最高的月份
- a1是衡量“季節性”空調使用情況的指標,其中 0 根本不是季節性的(每個月使用空調總量的 1/12),1 表示大約 76% 的空調使用在兩個最熱的個月。
model <- nls(elec_use_mean ~ b1 * month 6 * b0 * (1 tanh(a1 * (month - a0))),
start = list(b0 = 330, b1 = 300, a0 = 7, a1 = 0.5),
data = cumulative
)
summary(model)
#>
#> Formula: elec_use_mean ~ b1 * month 6 * b0 * (1 tanh(a1 * (month -
#> a0)))
#>
#> Parameters:
#> Estimate Std. Error t value Pr(>|t|)
#> b0 294.99540 16.88446 17.47 1.18e-07 ***
#> b1 379.93397 16.34690 23.24 1.25e-08 ***
#> a0 7.07014 0.05877 120.31 2.55e-14 ***
#> a1 0.61313 0.05616 10.92 4.39e-06 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 70.82 on 8 degrees of freedom
#>
#> Number of iterations to convergence: 8
#> Achieved convergence tolerance: 2.64e-06
我們可以通過生成一組平滑的預測來看到這很適合:
library(ggplot2)
new_df <- data.frame(month = seq(1, 12, 0.1))
new_df$elec_use_mean <- predict(model, new_df)
ggplot(cumulative, aes(month, elec_use_mean))
geom_point()
geom_line(data = new_df, linetype = 2)
scale_x_continuous(breaks = 1:12, labels = month.abb)

由
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460971.html
