Фильтрация Гамильтона в R

Это своего рода новый пользователь 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" "зоопарк"

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С помощью 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 } большое спасибо!

JF96 12.03.2024 18:00

Другие вопросы по теме