我想建议,重要的是开发一种物理上现实的,实用的能源成本模型。 这比原始数据的任何可视化效果更好,能够检测成本的变化。通过将此与SO上提供的解决方案进行比较,我们在将曲线拟合到数据与执行有意义的统计分析之间的区别方面进行了很好的案例研究。
(此建议是基于十年前将这样的模型适合我自己的家庭使用情况,并将其应用于该时期的变化。请注意,一旦模型适合,就可以轻松地在电子表格中对其进行计算以进行跟踪更改,因此我们不应该受到电子表格软件功能的限制。)
对于这些数据,这种物理上合理的模型与简单的替代模型(每日使用量相对于月平均温度的二次最小二乘拟合)产生的能源成本和使用方式有很大不同。因此,不能将较简单的模型视为理解,预测或比较能源使用模式的可靠工具。
分析
牛顿的冷却定律说,在一个很好的近似值下,(单位时间内的)加热成本应与外部温度和内部温度之差成正比。令比例常数为。也冷却的成本应该正比于该温度差,具有相似的-但不一定相同-比例性常数。(每一个都取决于房屋的隔热能力以及加热和冷却系统的效率。)ŤŤ0- αβ
估算和(表示为每单位时间每度的千瓦(或美元))是可以完成的最重要的事情,αβ因为它们使我们能够预测未来的成本以及衡量太阳能的效率。房屋及其能源系统。
因为这些数据是总用电量,所以它们包括非加热成本,例如照明,烹饪,计算和娱乐。 同样令人感兴趣的是此平均基本能源使用量(每单位时间)的估算,我将其称为:它为可节省多少能源提供了下限,并且可以在实现已知幅度的效率改善时预测未来成本。(例如,四年后,我用一个声称效率提高30%的炉子替换了一个熔炉-的确如此。)γ
最后,作为(总)近似值,我将假设房屋在整个一年中的温度保持在近似的水平。(在我的个人模型中,我分别假设两个温度分别用于冬季和夏季-但此示例中的数据不足以可靠地估算这两个温度,并且无论如何它们都非常接近。)值有助于评估将房屋保持在略有不同的温度下的后果,这是一种重要的节能选择。Ť0Ť0≤ 吨1个
数据显示出非常重要和有趣的复杂性:它们反映了外部温度波动期间的总成本,并且波动很大,通常约为每月年度范围的四分之一。正如我们将看到的,这在刚才描述的正确的基础瞬时模型和每月总计的值之间产生了很大的差异。在两个月(或两者都不发生)加热和冷却之间的几个月中,这种效果尤为明显。任何不考虑这种变化的模型都会错误地“认为”能源成本在任何月份的平均温度为时应处于基本费率,但实际情况却大不相同。γŤ0
除了月度温度波动的范围之外,我们没有(现成的)详细信息。我建议使用一种实用的方法来处理该问题,但是有点不一致。除极端温度外,每个月通常都会经历温度的逐渐升高或降低。这意味着我们可以使分布大致均匀。当均匀变量的范围具有长度,该变量的标准偏差为。我使用这种关系将范围(从到)转换为标准偏差。但是,从本质上讲,为了获得行为良好的模型,我将使用Normal来减小这些范围末端的变化大号s = L / 6–√Avg. Low
Avg. High
分布(这些估算的标准差和给出的均值Avg. Temp
)。
最后,我们必须将数据标准化为通用的单位时间。 尽管Daily kWh Avg.
变量中已经存在该变量,但是它缺乏精度,所以让我们将总数除以天数,以获取丢失的精度。
因此,在室外温度为时的单位时间冷却成本的模型为ÿŤ
ÿ(t )= γ+ α (t − t0)我(t < t0)+ β(t − t0)我(t > t0)+ ε (t )
其中是指标函数,表示该模型中未明确捕获的所有内容。它具有四个要估计的参数:和。(如果您确实确定可以确定它的值,而不是估计它。)一世εα ,β,γŤ0Ť0
因此,当温度随时间变化时,在时间段至内报告的总成本为X0X1个t(x)x
Cost(x0,x1)=∫x1x0y(t)dt=∫x1x0(γ+α(t(x)−t0)I(t(x)<t0)+β(t(x)−t0)I(t(x)>t0)+ε(t(x)))t′(x)dx.
如果该模型完全有效,则的波动应平均为接近零的值,并且似乎每月都会随机变化。用均值(月平均值)和标准差(如先前从月度范围给出的正态分布来近似的波动,并进行积分计算ε(t)ε¯t(x)t¯s(t¯)
y¯(t¯)=γ+(β−α)s(t¯)2ϕs(t¯−t0)+(t¯−t0)(β+(α−β)Φs(t0−t¯))+ε¯(t¯).
在这个公式中,是零均值和标准差的正态变量的累积分布;是它的密度。Φss(t¯)ϕ
模型拟合
该模型尽管表达了成本和温度之间的非线性关系,但是在变量和仍然是线性的。但是,由于它在是非线性的,并且是未知的,因此我们需要一个非线性拟合过程。为了说明,我简单地将其转储到似然最大化器中(用于计算),假设是独立且均匀分布的,且均值为零且正态标准差为。α,β,γt0t0R
ε¯σ
对于这些数据,估计为
(α^,β^,γ^,t0^,σ^)=(−1.489,1.371,10.2,63.4,1.80).
这表示:
加热成本约为 kWh /天/华氏度。1.49
冷却成本约为 kWh /天/华氏度。冷却效率更高。1.37
基本(非加热/冷却)能耗为 kWh /天。(这个数字是相当不确定的;更多数据将有助于更好地确定它。)10.2
房屋温度保持在华氏度左右。63.4
模型中未明确说明的其他变化的标准偏差为 kWh /天。1.80
这些估计中的不确定性的置信区间和其他定量表达式可以使用最大似然机制以标准方式获得。
可视化
为了说明该模型,下图绘制了数据,基础模型,对月平均值的拟合以及简单的最小二乘二次拟合。
每月数据显示为黑色十字。它们所在的水平灰线显示每月的温度范围。我们的基本模型反映了牛顿定律,由在温度处相遇的红色和蓝色线段表示。 我们对数据的拟合不是曲线,因为它取决于温度范围。因此,将其显示为单独的蓝色和红色实心点。(尽管如此,因为每月范围变化不大,所以这些点似乎确实画出了一条曲线-几乎与虚线的二次曲线相同。)最后,虚线是二次最小二乘拟合(适用于深色十字) )。t0
请注意,拟合值与基础(瞬时)模型相差多少,尤其是在中等温度下!这是每月平均的效果。(考虑在水平的每个灰色段上“涂抹”红色和蓝色线条的高度。在极端温度下,所有内容都集中在线条上,但是在中间温度下,“ V”的两侧要求平均,这反映了需要在一个月中的某些时候供暖,而其他时候的制冷。)
型号比较
这两个拟合-一个艰苦的开发和简单,轻松,二次拟合-彼此之间以及与数据点上都非常接近。二次拟合不太好,但是仍然很不错:其调整后的平均残差(针对三个参数)为 kWh /天,而牛顿定律模型的调整后平均残差(针对四个参数)为 kWh /天,降低约5%。 如果您只想在数据点上绘制一条曲线,那么二次拟合的简单性和相对保真度会为您推荐。2.071.97
但是,二次拟合对了解正在发生的事情完全没有用!它的公式
y¯(t¯)=219.95−6.241t¯+0.04879(t¯)2,
没有直接揭示任何使用。公平地说,我们可以对其进行一些分析:
这是一个抛物线,其顶点位于华氏度。我们可以将其用作恒定房屋温度的估计值。它与我们最初估计的度相差。但是,在此温度下的预计成本为 kWh /天。 这是牛顿定律所适用的基本能源使用量的两倍。t^0=6.241/(2×0.04879)=64.063.4219.95−6.241(63.4)+0.04879(63.4)2=20.4
从导数的绝对值获得加热或冷却的边际成本 。例如,使用此公式,当室外温度为度时,我们估算房屋取暖的成本为 kWh / day /°F。 这是牛顿法估算的值的两倍。法。 90-6.241+2(0.04879)(90)=2.54y¯′(t¯)=−6.241+2(0.04879)t¯90−6.241+2(0.04879)(90)=2.54
同样,在度的室外温度下加热房屋的成本估计为 kWh /天/华氏度。 这是牛顿定律估计值的两倍以上。| − 6.241 + 2 (0.04879 )(32 )| = 3.1232|−6.241+2(0.04879)(32)|=3.12
在中间温度下,二次拟合在另一个方向上出错。的确,即使平均温度包括低至度和高至度的天数,它在其至度范围内的顶点预测的边际加热或冷却成本几乎为零。(很少有人读这篇文章,他们仍然会在度(=摄氏度)时发热!)68 50 78 50 10606850785010
简而言之,尽管它在可视化中看起来几乎一样好,但是二次拟合在估计与能源使用相关的基本兴趣量时会严重出错。 因此,将其用于评估用法变化是有问题的,不建议使用。
计算方式
此R
代码执行了所有计算和绘图。它可以很容易地适应类似的数据集。
#
# Read and process the raw data.
#
x <- read.csv("F:/temp/energy.csv")
x$Daily <- x$Usage / x$Length
x <- x[order(x$Temp), ]
#pairs(x)
#
# Fit a quadratic curve.
#
fit.quadratic <- lm(Daily ~ Temp+I(Temp^2), data=x)
# par(mfrow=c(2,2))
# plot(fit.quadratic)
# par(mfrow=c(1,1))
#
# Fit a simple but realistic heating-cooling model with maximum likelihood.
#
response <- function(theta, x, s) {
alpha <- theta[1]; beta <- theta[2]; gamma <- theta[3]; t.0 <- theta[4]
x <- x - t.0
gamma + (beta-alpha)*s^2*dnorm(x, 0, s) + x*(beta + (alpha-beta)*pnorm(-x, 0, s))
}
log.L <- function(theta, y, x, s) {
# theta = (alpha, beta, gamma, t.0, sigma)
# x = time
# s = estimated SD
# y = response
y.hat <- response(theta, x, s)
sigma <- theta[5]
sum((((y - y.hat) / sigma) ^2 + log(2 * pi * sigma^2))/2)
}
theta <- c(alpha=-1, beta=5/4, gamma=20, t.0=65, sigma=2) # Initial guess
x$Spread <- (x$Temp.high - x$Temp.low)/sqrt(6) # Uniform estimate
fit <- nlm(log.L, theta, y=x$Daily, x=x$Temp, x$Spread)
names(fit$estimate) <- names(theta)
#$
# Set up for plotting.
#
i.pad <- 10
plot(range(x$Temp)+c(-i.pad,i.pad), c(0, max(x$Daily)+20), type="n",
xlab="Temp", ylab="Cost, kWh/day",
main="Data, Model, and Fits")
#
# Plot the data.
#
l <- matrix(mapply(function(l,r,h) {c(l,h,r,h,NA,NA)},
x$Temp.low, x$Temp.high, x$Daily), 2)
lines(l[1,], l[2,], col="Gray")
points(x$Temp, x$Daily, type="p", pch=3)
#
# Draw the models.
#
x0 <- seq(min(x$Temp)-i.pad, max(x$Temp)+i.pad, length.out=401)
lines(x0, cbind(1, x0, x0^2) %*% coef(fit.quadratic), lwd=3, lty=3)
#curve(response(fit$estimate, x, 0), add=TRUE, lwd=2, lty=1)
t.0 <- fit$estimate["t.0"]
alpha <- fit$estimate["alpha"]
beta <- fit$estimate["beta"]
gamma <- fit$estimate["gamma"]
cool <- "#1020c0"; heat <- "#c02010"
lines(c(t.0, 0), gamma + c(0, -alpha*t.0), lwd=2, lty=1, col=cool)
lines(c(t.0, 100), gamma + c(0, beta*(100-t.0)), lwd=2, lty=1, col=heat)
#
# Display the fit.
#
pred <- response(fit$estimate, x$Temp, x$Spread)
points(x$Temp, pred, pch=16, cex=1, col=ifelse(x$Temp < t.0, cool, heat))
#lines(lowess(x$Temp, pred, f=1/4))
#
# Estimate the residual standard deviations.
#
residuals <- x$Daily - pred
sqrt(sum(residuals^2) / (length(residuals) - 4))
sqrt(sum(resid(fit.quadratic)^2) / (length(residuals) - 3))