25

假设我有一个 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 没有发现任何明显的结果。

有人知道吗?

4

4 回答 4

27

您可以使用 quantmod包中的函数 方法从FRED获取 CPI 数据FREDgetSymbols

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"

BLS的CPI 通胀计算器

...使用给定日历年的平均消费者价格指数...对于当年,使用最新的月度指数值。

(对于这个答案,我将忽略上述引用的第二部分......)

所以,计算一个年平均值

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
于 2012-09-25T21:26:35.807 回答
9

有一个更简单的解决方案来获取不需要使用quantmod包的年度 CPI(例如,CPIAUCSL),至少在我的经验中,由于某种原因,它似乎总是存在兼容性问题。

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]
于 2014-09-26T20:47:38.737 回答
2

使用priceR,像这样:

set.seed(123)
prices <- rnorm(200, mean=10, sd=3)
years <- round(rnorm(200, mean=2006, sd=5))
df <- data.frame(prices, years)

library(priceR)
adjust_for_inflation(prices, years, "US", to_date = 2008)
# [1]  6.707112  8.102301 16.228195  9.785813 11.795624 17.197669 13.589684  7.210790  6.744690  9.250294 14.267029 11.561430  9.921566 12.007162 10.244619

笔记

  • 这种方法自动使用来自世界银行的最新 CPI 数据
  • adjust_for_inflation()适用于所有国家 - 您可以查看完整列表show_countries()
于 2020-03-26T13:34:58.883 回答
0

我认为应该指出的是,GSee 的解决方案在技术上是正确的,但可能不是大多数人在谈论通货膨胀调整时想要的。

以我的经验,大多数人都想知道过去几年购买的物品以今天的美元计算要花多少钱。

根据 GSee 的代码,这会产生:

as.numeric(avg.cpi['2008'])/avg.cpi
dat <- merge(p, cf, all=FALSE)
dat$adj <- dat[, 1] * dat[, 2]
于 2019-10-02T20:27:25.050 回答