【问题标题】:How can I balance a panel that is unbalanced in R?如何平衡 R 中不平衡的面板?
【发布时间】:2019-06-18 13:51:16
【问题描述】:

我的每月面板数据不平衡。有些国家缺少某些时间段,因此我的小组中没有这些时间段。我想添加这些句点并为它们分配一个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

【问题讨论】:

  • ?tidyr::complete。如果您分享一些示例输入,我们可以为您提供更多帮助。 (使用dput(),例如dput(droplevels(milk_state[1:20, ])) 来共享复制/可粘贴的示例数据。
  • 添加仅由 NA 组成的行有什么意义?你打算做什么?
  • 在这里我粘贴我从 dput() 获得的内容: structure(list(State = c("ARIZONA", "CALIFORNIA", "COLORADO", "FLORIDA", "IDAHO", "ILLINOIS) ", "印第安纳", "爱荷华", "堪萨斯", "密歇根"), 月份 = c("01 2018", "01 2018", "01 2018", "01 2018", "01 2018", "01 2018”, “01 2018”, “01 2018”, “01 2018”, “01 2018”), 值 = c(2165, 2005, 2220, 1775, 2055, 1800, 1945, 2015, 1985, 2190)), row.names = c(NA, -10L), class= c("tbl_df", "tbl", "data.frame"))
  • 嗯,那个特定的样本数据是完整的,但我相信tidyr::complete(milk_state, STATE, PERIOD) 会起作用。

标签: r panel missing-data balance


【解决方案1】:

事实上,您不想从现有数据中创建平衡样本(这是您对上面代码所做的),但您希望使用 STATEPERIOD 的所有可能组合来扩展您的样本.这需要多一步,即创建这些组合。从此开始

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

之后,获取所有可能组合的数据框df,并使用left_join 加入您现有的观察:

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

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

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2014-10-30
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多