插补后处理动物园对象列
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.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 在这种情况下只会忽略日期列并填充数据列
我有一个大型的每小时时间序列数据集,显示不同时间的温度。该系列中有许多缺失值 (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.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 在这种情况下只会忽略日期列并填充数据列