插补后处理动物园对象列

Manipulating zoo object column after imputation

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

我正在做采暖度日分析,这是将建筑物加热到室温所需的热量。如果室外温度低于 15.5 度,则需要加热。我希望忽略(或设置为 NA)高于 15.5 的值,并且只关注低于以下的温度。然后我想计算加热度天数,即 (15.5-Temp)*1/24(一天 24 小时)。这通常很简单,但是我在使用 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) 

这些是我的插补步骤:

#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、转换,但 none 似乎有效!

谢谢!

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

在这种情况下,您可以使用 as.vector 函数(参见 https://www.rdocumentation.org/packages/zoo/versions/1.8-6/topics/as.zoo),将 zoo 对象转换为 vector,您可以将其添加到data.frame.

下面的示例代码删除了 imputeTS,就像 G. Grothendieck says in his comment, since zoo's 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

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

直接在 data.frame 上应用 imputeTS 中的 na_interpolation (imputeTS 可以处理各种输入,例如 data.framevectorzootsxtstibbletsibble)

只是:

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 在这种情况下只会忽略日期列并填充数据列