Подтвердить что ты не робот

Пакет цен на инфляцию?

Скажем, у меня есть 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 не дал ничего очевидного.

Кто-нибудь знает что-нибудь?

4b9b3361

Ответ 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]