Пакет цен на инфляцию?
Скажем, у меня есть data.frame с ценами в один столбец и годы в другом:
prices <- rnorm(200, mean=10, sd=3)
years <- round(rnorm(200, mean=2006, sd=5))
df <- data.frame(prices, years)
Теперь скажите, что я хочу нормализовать все эти цены до 2008 года, используя индекс потребительских цен. Я мог бы взглянуть на значения конверсии и выполнить калькуляцию вручную, но моя интуиция подсказывает мне, что, возможно, есть пакет для этого автоматически. Поиск r-seek и cran не дал ничего очевидного.
Кто-нибудь знает что-нибудь?
Ответы
Ответ 1
Вы можете получить данные CPI от FRED, используя
FRED
метода функции getSymbols
в
quantmod
getSymbols("CPIAUCSL", src='FRED') #Consumer Price Index for All Urban Consumers: All Items
#[1] "CPIAUCSL"
tail(CPIAUCSL)
# CPIAUCSL
#2012-03-01 229.098
#2012-04-01 229.177
#2012-05-01 228.527
#2012-06-01 228.618
#2012-07-01 228.723
#2012-08-01 230.102
# make an `xts` object of prices
set.seed(1)
p <- xts(rnorm(63, mean=10, sd=3), seq(from=as.Date('1950-12-01'), by='years', length.out=63))
colnames(p) <- "price"
Калькулятор инфляции CPI в BLS
... использует средний индекс потребительских цен за данный календарный год... В текущем году используется последнее значение месячного индекса.
(Для этого ответа я проигнорирую вторую часть выше цитаты...)
Итак, вычислите среднегодовое значение
avg.cpi <- apply.yearly(CPIAUCSL, mean)
Затем разделите все индексы на базовую цену, чтобы создать коэффициент преобразования
cf <- avg.cpi/as.numeric(avg.cpi['2008']) #using 2008 as the base year
dat <- merge(p, cf, all=FALSE)
dat$adj <- dat[, 1] * dat[, 2]
tail(dat)
# price CPIAUCSL adj
#2006-12-01 8.898336 0.9363693 8.332128
#2007-12-01 6.867596 0.9632483 6.615200
#2008-12-01 11.709159 1.0000000 11.709159
#2009-12-01 9.594836 0.9967933 9.564069
#2010-12-01 17.204853 1.0131453 17.431015
#2011-12-01 9.882280 1.0449769 10.326754
Ответ 2
Существует гораздо более простое решение для получения ежегодного индекса потребительских цен (например, CPIAUCSL), который не требует использования пакета quantmod
, который, по-видимому, всегда имеет проблемы совместимости по той или иной причине, по крайней мере, по моему опыту.
require(lubridate) || install.packages("lubridate")
require(dplyr) || install.packages("dplyr")
monthly_cpi <-
read.table("http://research.stlouisfed.org/fred2/data/CPIAUCSL.txt",
skip = 53, header = TRUE)
monthly_cpi$cpi_year <- year(monthly_cpi$DATE)
yearly_cpi <- monthly_cpi %.% group_by(cpi_year) %.% summarize(cpi = mean(VALUE))
Затем, чтобы создать коэффициент корректировки, например, в прошлом году цены:
yearly_cpi$adj_factor <- yearly_cpi$cpi/yearly_cpi$cpi[yearly_cpi$cpi_year == 2013]
Вы должны узнать, сколько строк для skip
, но опять же, что заставляет вас фактически смотреть на строки, которые пропускаются, просматривая фактический источник данных, который, случается, имеет полезную информацию преамбулы.
НО ПОДОЖДИТЕ! БОЛЬШЕ!
Спасибо @GSee (кто дал проверенный ответ), отметив, что существует версия .csv
, для которой вам не нужно пропускать любые строки! Используя эту версию, код:
require(lubridate) || install.packages("lubridate")
require(dplyr) || install.packages("dplyr")
monthly_cpi <-
read.csv("http://research.stlouisfed.org/fred2/data/CPIAUCSL.csv", header = TRUE)
monthly_cpi$cpi_year <- year(monthly_cpi$DATE)
yearly_cpi <- monthly_cpi %.% group_by(cpi_year) %.% summarize(cpi = mean(VALUE))
yearly_cpi$adj_factor <- yearly_cpi$cpi/yearly_cpi$cpi[yearly_cpi$cpi_year == 2013]
Ответ 3
Я думаю, что следует отметить, что решение GSee является технически правильным, но, вероятно, не хочет, чтобы большинство людей хотело говорить о корректировке на инфляцию.
По моему опыту, большинство людей хотят знать, сколько будет стоить предмет, купленный в прошлые годы, в сегодняшних долларах.
На основе кода GSee это дает:
as.numeric(avg.cpi['2008'])/avg.cpi
dat <- merge(p, cf, all=FALSE)
dat$adj <- dat[, 1] * dat[, 2]