Stata编码帮助

时间:2018-11-14 23:56:34

标签: r matlab stata

我有一个不平衡的面板数据集,它为我提供了有关在不同地区放贷的银行数量的信息。地理位置ID和银行ID是使用egen id=group(var)之类的Stata命令创建的数字变量。

地理ID从1到n,银行ID从1到k。让您更具体地了解我的数据的外观:

Geography ID (gid) | Bank ID (bid) | lending
-----------------------------------------------
1                  | 1             | 25
1                  | 2             | 32
1                  | 4             | 83
----------------------------------------------
2                  | 1             | 76
2                  | 3             | 22
---------------------------------------------
3                  | 2             | 42
3                  | 3             | 12
3                  | 5             | 22
--------------------------------------------

我的最终目标是创建一个具有地理区域的所有成对组合的数据框,例如:

    1     2      3 ......... n
-------------------------------
1|(1,1)  (1,2)  (1,3)......(1,n)
2|(2,1)  (2,2)  (2,3)......(2,n)
.|  .      .                 .
n|(n,1)    .         ......(n,n)

条目(i,j)这样给我:

(i,j)=(Lending from Banks Operating in Area i and j)/(Total Lending in Area i and j)

例如给出上述数据

(1,1)=1       (1,2)=(25+76)/(25+32+83+76+22)     (1,3)=(32+42)/(25+32+83+42+12+22)

我觉得我首先应该循环使用levelsofbysort,但是我不确定如何解决这个问题。

即使您无法提供确切的解决方案,我也将非常感谢收到任何帮助或建议。尽管我更喜欢Stata,但我也对Matlab / R有一定的了解,因此,如果您认为它更适合该问题,我欢迎您提出建议。

1 个答案:

答案 0 :(得分:2)

这是一种R方法:

pairs = list(zip(starts, stops))

for start, stop in pairs:
    myrange = np.arange(start, stop, step)

这不是最有效的方法,但这只是一个开始。我很难做到真正的矢量化,因为每个子集都需要交集,尽管我确信可以对它进行优化,以免对每个等效对重新计算numpy两次(如果这是性能因素)


编辑:效率略高,不会重新计算等效对x <- data.frame( geoid = c(1,1,1, 2,2, 3,3,3), bankid = c(1,2,4, 1,3, 2,3,5), lending = c(25,32,83, 76,22, 42,12,22) ) myfunc <- function(x, i, j) { geos <- x$geoid %in% c(i, j) banks <- with(x, intersect(bankid[geoid == i], bankid[geoid == j])) with(x, sum(lending[geos & bankid %in% banks]) / sum(lending[geos])) } outer(unique(x$geoid), unique(x$geoid), function(i,j) mapply(myfunc, list(x), i, j)) # [,1] [,2] [,3] # [1,] 1.0000000 0.4243697 0.3425926 # [2,] 0.4243697 1.0000000 0.1954023 # [3,] 0.3425926 0.1954023 1.0000000

按地理位置拆分数据:

intersect(bankid...)

(仅证明我们仅计算了最小集合。)现在,将上三角的数据翻转到下三角:

geoid

并将已知值1分配给对角线:

geox <- split(x, x$geoid)

myfunc <- function(i, j) {
  if (i >= j) return(NA)
  banks <- intersect(geox[[i]]$bankid, geox[[j]]$bankid)
  sum(with(geox[[i]], lending[ bankid %in% banks ]),
      with(geox[[j]], lending[ bankid %in% banks ])) /
    sum(geox[[i]]$lending, geox[[j]]$lending)
}

o <- outer(seq_along(geox), seq_along(geox),
           function(i,j) mapply(myfunc, i, j))
o
#      [,1]      [,2]      [,3]
# [1,]   NA 0.4243697 0.3425926
# [2,]   NA        NA 0.1954023
# [3,]   NA        NA        NA