Это своего рода новый пользователь R. Я пытаюсь разложить ряды ВВП на тренд и цикл, используя предложенный Гамильтоном фильтр. Я использую пакет 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" "зоопарк"





С помощью 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_temp_xts <- as.xts(country_temp[, c("date", "gdp_value")])
Другой подход, предполагающий, что у вас есть односимвольный столбец, который вы хотите сделать числовым, заключается в использовании:
storage.mode(<name_of_xts_object>) <- "numeric"
Дайте мне знать, если это решит вашу проблему.
Второй подход решил проблему! Последний цикл for (country_j incountries_total) { Country_temp=gdp_list[[country_j]] Country_temp_xts <- as.xts(country_temp[, c("date", "gdp_value")]) Storage.mode(country_temp_xts) <- " числовое" gdp_value=country_temp_xts[,1] Country_temp_hf=yth_filter(100*log(gdp_value), h=8, p=4, выход=c("x", "тренд", "цикл")) filtered_gdp[[country_j] ]=country_temp_hf } большое спасибо!