Расчет индекса концентрации по регионам и годам (панельные данные)

Это мой первый пост, и я очень застрял в попытке построить свою первую функцию, которая вычисляет показатели Херфиндаля для валового выпуска фирмы, используя панельные данные (год = 1998: 2007) с фирмами = наб. по годам (1998-2007) и регионам ("Запад", "Центр", "Восток", "СВ") и у меня проблемы с передачей аргументов через функцию. Я думаю, мне нужно использовать два цикла (один для времени и один для региона). Любая помощь будет полезна. Я действительно не хочу подмножать свои данные 400+ раз, чтобы получить измерения Херфиндаля по одному. Заранее спасибо!

Ниже я предоставляю: 1) Мой стартовый код (возвращает только одно значение); 2) желаемый результат (2 ячейки, содержащие меры Хефиндаля по 1) году и по 2) году-региону); и 3) исходные данные

1) Мой стартовый код

myherf<- function (x, time, region){
time = year # variable is defined in my data and includes c(1998:2007)
region = region # Variable is defined in my data, c("West", "Central","East","NE")
    for (i in 1:length(time)) {
      for (j in 1:length(region)) {
        herf[i,j] <- x/sum(x)
        herf[i,j] <- herf[i,j]^2
        herf[i,j] <- sum(herf[i,j])^1/2        
      }
    }
  return(herf[i,j])
}

myherf(extractiveoutput$x, i, j)
Ошибка в herf[i, j] ‹- x/sum(x): объект 'herf' не найден


2) Мой желаемый результат - следующие два вектора:

A. (1x10 vector)              
Year  herfindahl(yr)  
1998    x                        
1999    x                       
...                             
2007    x                       

B. (1x40 vector)  
Year  Region   hefindahl(yr-region)  
1998  West      x                                     
1998  Central   x                                    
1998  East      x    
1998  NE        x    
...  
2007  West      x    
2007  Central   x  
2007  East      x   
2007  northeast x   

3) Исходные данные

Obs. industry year  region    grossoutput  
1         06 1998    Central 0.048804830  
2         07 1998    Central 0.011222478  
3         08 1998    Central 0.002851575  
4         09 1998    Central 0.009515881  
5         10 1998    Central 0.0067931  
...  

12        06 1999    Central 0.050861447  
13        07 1999    Central 0.008421093  
14        08 1999    Central 0.002034649  
15        09 1999    Central 0.010651283  
16        10 1999    Central 0.007766118  
...  
111       06 1998       East 0.036787413  
112       07 1998       East 0.054958377  
113       08 1998       East 0.007390260  
114       09 1998       East 0.010766598  
115       10 1998       East 0.015843418  
...  
436       31 2007       West 0.166044176  
437       32 2007       West 0.400031011  
438       33 2007       West 0.133472059  
439       34 2007       West 0.043669662  
440       45 2007       West 0.017904620  

person Anthony Howell    schedule 04.10.2012    source источник
comment
Что такое herf? Я бы предложил подход data.table, но вы объясните, что такое herf   -  person mnel    schedule 05.10.2012
comment
Я думаю, вам нужно начать с определения herf <- matrix(nrow=length(time),ncol=length(region)) (и вы, вероятно, хотите вернуть всю матрицу herf, а не herf[i,j])   -  person Ben Bolker    schedule 05.10.2012


Ответы (1)


Вы можете использовать функцию conc из библиотеки ineq. Решение становится очень простым и быстрым, используя data.table.

library(ineq)
library(data.table)

# convert your data.frame into a data.table
  setDT(df)

# calculate inequality of grossoutput by region and year
  df[, .(inequality = conc(grossoutput, type = "Herfindahl")), by=.(region, year) ]
person rafa.pereira    schedule 29.05.2017