我的每月面板数据不平衡。有些国家缺少某些时期,因此我的小组没有这些时期。我想添加这些时间段并为其分配一个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
答案 0 :(得分:0)
实际上,您不想从现有数据中创建一个平衡的样本(这是您在上面的代码中所做的),但是您想使用STATE
和{的所有可能组合来扩展样本{1}}。这需要再执行一个步骤,即创建这些组合。从此开始
PERIOD
此后,采用所有可能组合的数据框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
是一个包含所有ID和PERIOD的平衡样本。对于计算,如果您的设置允许对变量值进行这样的假设,则可能会缺失平均值或零插补值,并且从狭义上来说,您有一个均衡的样本,即样本中仅包含具有所有期间观测值的ID。