如何平衡一个R不平衡的面板?

mftmpeh8  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(199)

我有一个不平衡的月度小组数据。有些国家缺少一些时段,因此我的小组中没有这些时段。我想添加这些时段,并为其指定一个NA值。
我尝试了一个函数来平衡面板,但它所做的是消除所有州不匹配的所有观测。因此,如果没有亚拉巴马州在02-2008年的数据,它将消除所有州在02-2008年的观测。

balanced <- function(data, ID, TIME, VARS, required=c("all", "shared")) {
  if(is.character(ID)) {
    ID <- match(ID, names(data))
  }
  if(is.character(TIME)) {
    TIME <- match(TIME, names(data))
    if(missing(VARS)) { 
      VARS <- setdiff(1:ncol(data), c(ID,TIME))
    } else if (is.character(VARS)) {
      VARS <- match(VARS, names(data))
    }
    required <- match.arg(required)
    idf <- do.call(interaction, c(data[, ID, drop=FALSE], drop=TRUE))
    timef <- do.call(interaction, c(data[, TIME, drop=FALSE], drop=TRUE))
    complete <- complete.cases(data[, VARS])
    tbl <- table(idf[complete], timef[complete])
    if (required == "all") {
      keep <- which(rowSums(tbl == 1) == ncol(tbl))
      idx <- as.numeric(idf) %in% keep
    } else if (required == "shared") {
      keep <- which(colSums(tbl == 1) == nrow(tbl))
      idx <- as.numeric(timef) %in% keep
    }
    data[idx, ]
  }

Balanced_panel <- balanced(milk_state, "STATE", "PERIOD", "VALUE", required = "all")

它看起来是这样的:

STATE       PERIOD    VALUE
California    01-2018     900
California    02-2018     890
California    03-2018     780
California    05-2018     800

我希望它看起来是这样的:

STATE       PERIOD    VALUE
California    01-2018     900
California    02-2018     890
California    03-2018     780
California    04-2018      NA
California    05-2018     800
xdnvmnnf

xdnvmnnf1#

实际上,您并不想从现有数据创建一个平衡的样本(这是您在上面的代码中所做的),但是您想使用STATEPERIOD的所有可能组合来扩展您的样本。这需要多一个步骤,即创建这些组合。

library(tidyverse)
data$ID %>% unique() %>%
  expand.grid(., seq('2018-01-01', '2018-05-01', by = 'month')) %>%
  rename("ID" = 1, "PERIOD" = 2) -> df

然后,获取所有可能组合的 Dataframe df,并使用left_join连接现有观测:

df %>%
  left_join (data, by = c("ID", "PERIOD") -> data

生成的 Dataframe data是一个包含所有ID和PERIOD的平衡样本。对于计算,如果设置允许对变量值进行此类假设,则可以对缺失值进行均值插补或零插补,并且在样本中仅存在具有所有时段的观测值的ID的狭义上,您具有平衡样本。

相关问题