【问题标题】:Manipulating zoo object column after imputation插补后操作动物园对象列
【发布时间】:2020-01-19 06:26:38
【问题描述】:

我有一个大型的每小时时间序列数据集,显示不同时间的温度。该系列中有许多缺失值 (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,但似乎都不起作用!

谢谢!

【问题讨论】:

  • @RonakShah 我已经编辑了帖子,希望对您有所帮助!
  • @RonakShah 嗨,对不起,我在开头的段落中解释了。我想将高于 15.5 的温度设置为 NA,然后使用所示公式将温度转换为加热度日。
  • (1) DateTimes &lt;- 行有语法错误。请修复。 (2) 如果您无论如何都在使用动物园,那么您可以使用该软件包中的na.approx。不需要其他软件包。 (3) 显示的代码最好写成transform(HourTemp, airTempImp = round(na.approx(MeanTemp, na.rm = FALSE), 1), Imputed = ifelse(is.na(MeanTemp), "Imputed", "Observed")) (4) 你遇到问题的代码到底是什么???
  • @G.Grothendieck (1) 对不起,日期时间的语法错误,我已经有一个日期时间列,所以只是用它来显示它应该是什么。 (2)/(3) 好吧,看起来更好! (4) 我在将 airTempImp 转换为指定的加热度日时遇到问题。作为一个角色,我可以做到这一点,但作为动物园对象却遇到了问题。

标签: r time-series zoo imputets


【解决方案1】:

听起来您还没有将 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 在他的评论中所说的那样,因为动物园的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

【讨论】:

  • 谢谢!!完美解决了这个问题!我必须在 na.approx. 中包含 na.rm = FALSE。
  • na.approx 直接在普通向量上工作,如我在问题下的评论中的代码所示,因此无需首先转换为 zoo 并返回。
【解决方案2】:

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

只需将 imputeTS 中的na_interpolation 直接应用于 data.frame (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 在这种情况下将忽略日期列并填充数据列

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2011-12-14
    • 2013-02-13
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多