0

我有一个大型的每小时时间序列数据集,显示不同时间的温度。该系列中有许多缺失值 (NA),因此我使用线性插值来使用 imputeTS 包估算缺失值。在插值之前,我被告知要为估算值创建一个列作为动物园对象。这用推算的温度替换了任何 NA 温度。

我正在做采暖度日分析,这是将建筑物加热到室温所需的加热。如果室外温度低于 15.5 度,则需要加热。我希望忽略(或设置为 NA)高于 15.5 的值,只关注以下温度。然后我想计算加热度天数,即(15.5-Temp)*1/24(一天 24 小时)。这通常很简单,但是我在处理动物园对象时遇到了麻烦。有人可以帮忙吗??

数据示例如下:

DateTimes <- as.POSIXct(c("2009-01-01 00:00:00", "2009-01-01 01:00:00", "2009-01-01 02:00:00", "2009-01-01 03:00:00", "2009-01-01 04:00:00", "2009-01-01 05:00:00", "2009-01-01 06:00:00"))
MeanTemp <- c(0.8, 0.7, 0.7, NA, 0.8, 0.9, 1.1)

HourTemp <- data.frame(DateTimes, MeanTemp) 

这些是我的插补步骤:

#Use linear interpolation to impute missing values
TempImp <- zoo(HourTemp$MeanTemp, HourTemp$DateTimes)
TempImp <- imputeTS::na.interpolation(TempImp, option = "linear")
#Add imputed values to data
as.data.frame(HourTemp)
HourTemp$airTempImp <- round(TempImp,1)
#Add imputed flag
HourTemp$Imputed <- ifelse(is.na(HourTemp$MeanTemp), "Imputed", "Observed")
HourTemp

插补工作成功,用估计值替换了 NA 值,但我无法操纵动物园对象“airTempImp”来创建开头段落中指定的加热度天数列。

我尝试过使用 ifelse、ifelse.zoo、transform 但似乎都没有工作!

谢谢!

4

2 回答 2

0

听起来您还没有将zoo对象转换为更通用的 R 对象(但您没有给出错误消息或产生它的代码,所以我不能 100% 确定)。

在这种情况下,您可以使用该as.vector功能(请参阅https://www.rdocumentation.org/packages/zoo/versions/1.8-6/topics/as.zoo)将zoo对象转换为 a vector,您可以将其添加到一个数据框。

下面的示例代码删除imputeTS了 ,就像G. Grothendieck在他的评论中所说的那样,因为动物园na.approx做了线性插值。

# install.packages("zoo")
library("zoo")

DateTimes <- as.POSIXct(c(
  "2009-01-01 00:00:00", "2009-01-01 01:00:00",
  "2009-01-01 02:00:00", "2009-01-01 03:00:00",
  "2009-01-01 04:00:00", "2009-01-01 05:00:00", "2009-01-01 06:00:00"))
MeanTemp <- c(0.8, 0.7, 0.7, NA, 0.8, 0.9, 1.1)
HourTemp <- data.frame(DateTimes, MeanTemp)
TempImp <- zoo(HourTemp$MeanTemp, HourTemp$DateTimes)

# use zoo's linear interpolation
HourTemp$airTempImp <- as.vector(na.approx(TempImp))
HourTemp$Imputed <- ifelse(is.na(HourTemp$MeanTemp), "Imputed", "Observed")

# calculates the heating degree day per hour if temp > 15.5,
# else sets to 0 (no heating)
HourTemp$HeatingDegreeDay <- ifelse(
  HourTemp$airTempImp > 15.5,
  0, # no heating
  (15.5 - HourTemp$airTempImp) / 24
)

这将输出:

HourTemp
            DateTimes MeanTemp airTempImp  Imputed HeatingDegreeDay
1 2009-01-01 00:00:00      0.8       0.80 Observed        0.6125000
2 2009-01-01 01:00:00      0.7       0.70 Observed        0.6166667
3 2009-01-01 02:00:00      0.7       0.70 Observed        0.6166667
4 2009-01-01 03:00:00       NA       0.75  Imputed        0.6145833
5 2009-01-01 04:00:00      0.8       0.80 Observed        0.6125000
6 2009-01-01 05:00:00      0.9       0.90 Observed        0.6083333
7 2009-01-01 06:00:00      1.1       1.10 Observed        0.6000000
于 2019-09-18T14:00:30.630 回答
0

您的解决方案太复杂了——因为无论如何您似乎都想要一个 data.frame,您不需要将数据转换为 zoo 对象。

只需na_interpolationimputeTS直接在 data.frame 上应用(imputeTS 可以处理各种输入,例如data.frame, vector, zoo, ts, xts, tibble, tsibble

只是:

library(imputeTS)
DateTimes <- as.POSIXct(c("2009-01-01 00:00:00", "2009-01-01 01:00:00", 
  "2009-01-01 02:00:00", "2009-01-01 03:00:00", "2009-01-01 04:00:00",
  "2009-01-01 05:00:00", "2009-01-01 06:00:00"))

MeanTemp <- c(0.8, 0.7, 0.7, NA, 0.8, 0.9, 1.1)
HourTemp <- data.frame(DateTimes, MeanTemp)

Imputed <- imputeTS::na.interpolation(HourTemp, option = "linear")

在这种情况下 imputeTS 将忽略日期列并填充数据列

于 2020-02-10T23:30:28.490 回答