假设我有一个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并没有产生任何明显的结果。
有谁知道什么?
答案 0 :(得分:25)
您可以使用FRED从quantmod获取CPI数据
FRED
函数的getSymbols
方法
CPI inflation calculator at the BLS包
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"
...使用给定日历年的平均消费者物价指数... 对于当前年度,使用最新的月度指数值。
(对于这个答案,我将忽略{{3}}的第二部分......)
所以,计算年平均值
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
答案 1 :(得分:7)
有一个更简单的解决方案,用于获取不需要使用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
的行数,但是再一次,这会导致你实际查看通过查看实际数据源而跳过的行,这些行恰好有前导信息。< / p>
但等等!还有更多!
感谢@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]
答案 2 :(得分:1)
使用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
注释
adjust_for_inflation()
适用于所有国家/地区-您可以查看包含show_countries()
的完整列表答案 3 :(得分:0)
我认为应该指出的是,GSee的解决方案在技术上是正确的,但在谈论通货膨胀调整时,大多数人可能不希望这样做。
根据我的经验,大多数人都想知道过去几年中购买的商品今天要花费多少钱。
基于GSee的代码,它产生:
as.numeric(avg.cpi['2008'])/avg.cpi
dat <- merge(p, cf, all=FALSE)
dat$adj <- dat[, 1] * dat[, 2]