时间序列数据 - 计算差异

时间:2016-07-15 12:52:59

标签: r time-series

原始问题

我即将对仿制药进行分析 - 更具体地说,我希望在药物专利到期后观察价格的发展。

我在下面的例子中提供了数据 - 列jan.2001到dec.2001代表2001年的月份 - 在每一列下,我有每日定义剂量的平均价格给定月份的仿制药。这些药物各自有一个独特的名称,由 ATC-column 中所述的ATC代码表示。

我还有一个名为 expiry 的专栏,其中列出了药品专利到期的月份。

任何人都可以告诉我,我如何计算自patent_expiry中列出的日期到每个ID的最新日期(前面提到的例子中的第12期)以来的价格差异?

更新了问题(包含Veera的解决方案):

以下是我当前数据的示例

> head(dfm)
   ATC     expiry     jan.2001 feb.2001 mar.2001 apr.2001 maj.2001 jun.2001 jul.2001 aug.2001 sep.2001 okt.2001 nov.2001 dec.2001  res
1 A02BC01  feb.2001     11.9     11.9     12.0     12.0     11.8     11.9     11.9     11.9     11.8     12.0     11.9     11.9  0.0
2 A02BC02  jul.2001     11.8     10.9     11.1     11.3     11.2     11.0     11.5     11.1     10.8     11.0     10.5      8.4 -3.1
3 A02BC03  okt.2001      9.3      8.9      8.8      8.8      8.8      8.7      8.7      8.7      8.7      8.7      7.8      7.4 -1.3
4 A02BC05  nov.2001     10.6     10.4     10.6     10.6     10.5     10.5     10.4     10.4     10.6     10.5     10.4     10.4  0.0
5 A03FA03  nov.2001      5.4      4.9      5.0      4.5      4.4      4.5      4.6      4.3      4.4      4.4      4.9      5.1  0.2

最后一栏' res'是我原来问题的解决方案

> str(dfm)
'data.frame':   5 obs. of  15 variables:
 $ ATC     : Factor w/ 5 levels "A02BC01 ","A02BC02 ",..: 1 2 3 4 5
 $ expiry  : chr  "feb.2001" "jul.2001" "okt.2001" "nov.2001" ...

我目前的解决方案代码

dfm <- read.csv2("aip.csv", header = T, sep = ";", dec = ",")

dfm$expiry = as.character(dfm$expiry)

# Generate formula to calculate the savings
calc = function(){
  res = integer(nrow(dfm)) 
 for (i in 1:nrow(dfm)){ 
   res[i] = dfm[i,"dec.2001"] - dfm[i,dfm[i,"expiry"]]
 }
 return(res)
}

# Insert calculation into data frame
dfm$res = calc()

我想生成一个新的数据框,让我们称之为节省,并计算给定ATC到期月后的每个后续月份的节省。我正在考虑类似的事情:

ATC     expiry       jan.2001 feb.2001 mar.2001 apr.2001 maj.2001 jun.2001 jul.2001 aug.2001 sep.2001 okt.2001 nov.2001 dec.2001
A02BC01  feb.2001     NA       NA      -0.1     -0.1      0.1      0.1      0.1      0.1      0.2      0.1     0.0      0.0
A02BC02  jul.2001     NA       NA       NA       NA       NA       NA       NA       0.4      0.7      0.5     1.0      3.1
A02BC03  okt.2001     NA       NA       NA       NA       NA       NA       NA       NA       NA       0       0.9      1.3

例如:具有ATC标识符A02BC01的药物于2001年2月获得专利。现在,我想计算一下与3月3月,3月,5月,3月相比的价格差异 - 基本上是在到期月之后的每个月。

最后,我希望将每个时期的节省量与匹配期间的销售量相乘,以匹配ATC。例如,对于药物A02BC02: (Price_expiry-price_december)* salesvolume_december

最终,由于到期月后价格下降,将计算12月份销售额节省的金额。我有一个数据集,其中包含所有ATC的定义的每日dosis量和与上述数据集匹配的日期(即与之前显示的价格数据集相同的结构)。

你能帮我扩展解决方案吗?

1 个答案:

答案 0 :(得分:1)

首先,您不应该使用数字命名列。这是一个简单的例子,通过创建一个函数。

jan = sample(1:20,5)
feb = sample(1:20,5)
mar = sample(1:20,5)
apr = sample(1:20,5)
expiry = c("jan","feb","mar","apr","jan")
dfm = data.frame(jan,feb,mar,apr,expiry)
dfm$expiry = as.character(dfm$expiry)

calc = function(){
    res = integer(nrow(dfm))
    for (i in 1:nrow(dfm)){
              res[i] = dfm[i,"apr"] - dfm[i,dfm[i,"expiry"]]
          }
    return(res)
}
dfm$res = calc()

  jan feb mar apr expiry res
1   5   4  14  12    jan   7
2  19   3  12   5    mar  -7
3   2   6   5   6    apr   0
4   9  10  15  16    feb   6
5  16   7  20  15    jan  -1