Как рассчитать средние темпы роста группы переменных за 5 лет в панельном наборе данных в R

Я хочу рассчитать среднюю скорость роста некоторых переменных в моей базе данных за 5 лет, сгруппированных по коду переменной. Это означает, что в первые 4 года по каждой переменной у меня должны быть НП. базу данных можно скачать здесь

    pwt<-structure(list(code = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("ABW", 
"AFG", "AGO", "AIA", "ALB", "AND", "ANT", "ARE", "ARG", "ARM", 
"ATG", "AUS", "AUT", "AZE", "BDI", "BEL", "BEN", "BFA", "BGD", 
"BGR", "BHR", "BHS", "BIH", "BLR", "BLZ", "BMU", "BOL", "BRA", 
"BRB", "BRN", "BTN", "BWA", "CAF", "CAN", "CH2", "CHE", "CHL", 
"CHN", "CIV", "CMR", "COD", "COG", "COK", "COL", "COM", "CPV", 
"CRI", "CSK", "CUB", "CUW", "CYM", "CYP", "CZE", "DEU", "DJI", 
"DMA", "DNK", "DOM", "DZA", "ECU", "EGY", "ERI", "ESP", "EST", 
"ETH", "FIN", "FJI", "FRA", "FSM", "GAB", "GBR", "GEO", "GHA", 
"GIN", "GMB", "GNB", "GNQ", "GRC", "GRD", "GRL", "GTM", "GUY", 
"HKG", "HND", "HRV", "HTI", "HUN", "IDN", "IND", "IRL", "IRN", 
"IRQ", "ISL", "ISR", "ITA", "JAM", "JOR", "JPN", "KAZ", "KEN", 
"KGZ", "KHM", "KIR", "KNA", "KOR", "KWT", "LAO", "LBN", "LBR", 
"LBY", "LCA", "LIE", "LKA", "LSO", "LTU", "LUX", "LVA", "MAC", 
"MAR", "MCO", "MDA", "MDG", "MDV", "MEX", "MHL", "MKD", "MLI", 
"MLT", "MMR", "MNE", "MNG", "MOZ", "MRT", "MSR", "MUS", "MWI", 
"MYS", "NAM", "NCL", "NER", "NGA", "NIC", "NLD", "NOR", "NPL", 
"NRU", "NZL", "OMN", "PAK", "PAN", "PER", "PHL", "PLW", "PNG", 
"POL", "PRI", "PRK", "PRT", "PRY", "PSE", "PYF", "QAT", "RKS", 
"ROU", "RUS", "RWA", "SAU", "SDN", "SEN", "SGP", "SLB", "SLE", 
"SLV", "SMR", "SOM", "SRB", "STP", "SUN", "SUR", "SVK", "SVN", 
"SWE", "SWZ", "SXM", "SYC", "SYR", "TCA", "TCD", "TGO", "THA", 
"TJK", "TKM", "TLS", "TON", "TTO", "TUN", "TUR", "TUV", "TWN", 
"TZA", "UGA", "UKR", "URY", "USA", "UZB", "VCT", "VEN", "VGB", 
"VNM", "VUT", "WSM", "YEM", "YUG", "ZAF", "ZMB", "ZWE"), class = "factor"), 
    year = c(2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 
    2007L, 2008L, 2009L, 2010L, 2000L, 2001L, 2002L, 2003L, 2004L, 
    2005L, 2006L, 2007L, 2008L, 2009L, 2010L), pop = c(0.090852998197079, 
    0.092897996306419, 0.094991996884346, 0.097016997635365, 
    0.098737001419067, 0.10003100335598, 0.100832000374794, 0.101219996809959, 
    0.101352997124195, 0.101452998816967, 0.101668998599052, 
    16.4409236907959, 16.9832668304443, 17.5726490020752, 18.203369140625, 
    18.8657169342041, 19.5525417327881, 20.2623996734619, 20.9976863861084, 
    21.7594203948975, 22.5495471954346, 23.3691310882568), rgdpe = c(4000.837890625, 
    3934.59619140625, 3882.55322265625, 3927.7529296875, 4201.69677734375, 
    4269.41748046875, 4308.62158203125, 4532.29345703125, 4572.1005859375, 
    4424.11865234375, 3971.60205078125, 37389.5859375, 37317.37109375, 
    42393.3671875, 44311.0546875, 52615.54296875, 65769.65625, 
    83384, 91420.0234375, 109108.0078125, 89716.453125, 126393.3203125
    ), rgdpo = c(3892.32348632812, 4312.86328125, 3251.35205078125, 
    3331.43383789062, 3727.60400390625, 3958.794921875, 4168.10546875, 
    4233.91845703125, 4455.19775390625, 4180.31884765625, 3767.7861328125, 
    32316.541015625, 34724.8828125, 39094.16796875, 42965.86328125, 
    51902.34375, 70721.609375, 94126.828125, 107016.71875, 132309.03125, 
    101159.71875, 139946.859375)), row.names = c(51L, 52L, 53L, 
54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 119L, 120L, 121L, 122L, 
123L, 124L, 125L, 126L, 127L, 128L, 129L), class = "data.frame")

Я создал следующую функцию, чтобы получить средний темп роста за 5 лет.

    growth5<-function(x){
    grorat<-(x/lag(x, k = 5))^(1/5)-1
    return(grorat)}

И после того, как я использовал mutate из dplyr вот так,

pwt <- pwt %>% group_by(code) %>% mutate(across(c(rgdpe:rgdpo), ~ growth5(.), .names = "{col}_grow"))

Однако, как вы увидите, я получаю только 0 в новых столбцах (новые переменные), и нет НП там, где я ожидал.

Большое спасибо заранее!


person Reynaldo Senra    schedule 02.09.2020    source источник
comment
Привет, поделитесь данными соответствующим образом, прочтите как -to-make-a-great-r-reproducible-example. В минимальном примере никогда не нужны все данные. Также укажите все library звонки, которые вы использовали.   -  person jay.sf    schedule 02.09.2020
comment
Хм. За исключением ошибки, поскольку q_gdp отсутствует в наборе данных, ваш код работает нормально. Единственный пакет, который я загрузил в своем сеансе, был dplyr.   -  person stefan    schedule 02.09.2020
comment
Дорогой Стефан, большое спасибо. похоже, возник конфликт с lag (), потому что я загрузил dplyr и статистику одновременно, и оба используют lag (). Теперь это почти нормально, но я получаю только одну строку NA за каждый первый год, и предполагается, что она даст строки NA в первые 4 года. Действительно, полученные темпы роста неверны. Однако на примере петербонов это работает отлично. Намек?   -  person Reynaldo Senra    schedule 02.09.2020


Ответы (2)


Для этого вы можете использовать функцию lag() из пакета dplyr. В следующем примере вы можете видеть, что первые 4 значения в векторе с задержкой - это NA, а затем пятая запись является результатом формулы скорости роста:

library(dplyr)

test <- (1:10)^2

growthrate <- function(x) { 
  (x/lag(x,5)^(1/5)-1)
   }

growthrate(test)

[1]       NA       NA       NA       NA       NA 35.00000 36.13506 40.24122 45.52228 51.53056

person pieterbons    schedule 02.09.2020
comment
Дорогие питербоны, большое спасибо за быстрый ответ. Однако я ищу среднюю скорость роста (x / x [-5]) ^ (1/5) -1. Что-то вроде этого. - person Reynaldo Senra; 02.09.2020
comment
извините, я неправильно понял. Я скорректировал ответ. Не уверен, почему ваш собственный код не работает, поскольку он кажется очень похожим. Убедитесь, что вы используете функцию lag () из dplyr, а не из пакета stats. - person pieterbons; 02.09.2020
comment
Дорогие Питербоны, еще раз большое вам спасибо. Невероятно, функция хорошо работает в вашем примере, но она неправильно рассчитывает средние темпы роста в моей базе данных. действительно, он оставляет 5 строк NA (остается только одна строка NA) - person Reynaldo Senra; 03.09.2020

наконец-то я получил решение, исключающее создание функции роста, поэтому мне просто нужно было написать следующую строку

pwt <- pwt %>% group_by(code) %>% mutate(across(c(rgdpe:rgdpo), ~ (./lag(., 5))^(1/5)-1, .names = "{col}_grow"))

Однако я до сих пор не знаю, почему опция в моем исходном сообщении не рассчитывает темпы роста должным образом и не оставляет 5 строк NA в начале каждого кода (кодов стран) в базе данных.

person Reynaldo Senra    schedule 02.09.2020