R 中的汉密尔顿过滤

问题描述 投票:0回答:1

这里是新 R 用户。 我正在尝试使用汉密尔顿提出的过滤器将 GDP 系列分解为趋势和周期 我正在关注 neverhpfilter 包(https://github.com/JustinMShea/neverhpfilter?tab=readme-ov-file#readme

这是我的设置

library(OECD)
library(tidyr)
library(neverhpfilter)
library(lubridate)
gdp_data=get_dataset("QNA")

gdp_data=gdp_data[gdp_data$SUBJECT=="B1_GS1",]

gdp_data=gdp_data[gdp_data$MEASURE=="CQR",]

gdp_data=gdp_data[gdp_data$TIME_FORMAT=="P3M",]

gdp_data=gdp_data[,c(2,5,10)]
gdp_data$ObsValue=as.numeric(gdp_data$ObsValue)
gdp_growth=gdp_data%>%
  group_by(LOCATION)%>%
  mutate(growth=log(ObsValue)-dplyr::lag(log(ObsValue)))

gdp_growth$Time=yq(gdp_growth$Time)
gdp_growth=gdp_growth[gdp_growth$Time>="1991-04-01",]
gdp_growth$LOCATION <- countrycode(gdp_growth$LOCATION, origin = "iso3c", destination = "country.name")
colnames(gdp_growth)=c("country", "gdp_value", "date", "growth")


gdp_list=split(gdp_growth, gdp_growth$country)
countries_total=names(gdp_list)
filtered_gdp=list()


for (country_j in countries_total) {
  country_temp=gdp_list[[country_j]]
  country_temp_xts=as.xts(country_temp)
  gdp_value=country_temp_xts[,c(2)]
  country_temp_hf=yth_filter(100*log(gdp_value), h=8, p=4, output=c("x", "trend", "cycle"))
  filtered_gdp[[country_j]]=country_temp_hf
  
}


我收到一条错误消息

Error in log(gdp_value) : non-numeric argument to mathematical function

但是在示例中,过程中使用的数据与我的数据是同一类

类(country_temp_xts) [1]“xts”“动物园”

r filter numeric
1个回答
0
投票

使用

library(countrycode)
能够运行大部分代码,这很有帮助。

我相信该错误与您的

xts
对象的结构有关,并且
gdp_value
是字符而不是数字。

一步一步,我相信这就是您的

for
块中正在发生的事情:

您可以从此开始(以第一个国家/地区为例,澳大利亚):

country_j <- countries_total[1]
country_temp=gdp_list[[country_j]] 

那么

str(country_temp)
将是:

'data.frame':   130 obs. of  4 variables:
 $ country  : chr  "Australia" "Australia" "Australia" "Australia" ...
 $ gdp_value: num  102357 104041 110785 102777 105668 ...
 $ date     : Date, format: "1991-04-01" "1991-07-01" "1991-10-01" "1992-01-01" ...
 $ growth   : num  0.0288 0.0163 0.0628 -0.075 0.0277 ...

您将看到 data.frame 包含日期、数字

gdp_value
growth
,以及
country
的字符值(不同类型的混合)。

当您转换为

xts
对象时:

country_temp_xts=as.xts(country_temp)

你有

str(country_temp_xts)

An xts object on 1991-04-01 / 2023-07-01 containing: 
  Data:    character [130, 3]
  Columns: country, gdp_value, growth
  Index:   Date [130] (TZ: "UTC")

注意,这有

Data
作为字符,而不是 数字。这是因为这些对象是具有有序索引属性的矩阵。您不能混合类型,但可以使用 data.frame。

一个选项是选择

gdp_value

,这是您正在使用的唯一值,不包括其他字符列,然后转换为 
xts
 对象:

country_temp2 <- as.xts(country_temp[, c("date", "gdp_value")])
另一种方法,假设您有一个单字符列,您希望将其设置为数字,则使用:

storage.mode(<name_of_xts_object>) <- "numeric"
请告诉我这是否能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.