我有一些类似于这样的数据。
ID year var1 var2
1 1 1 NA 0.5632595
2 1 2 0.7546097 0.5609945
3 1 3 -0.4241935 NA
4 1 4 0.4056908 0.5890453
5 2 1 -0.8049815 0.3504281
6 2 2 0.8049250 0.4817798
7 2 3 NA NA
8 2 4 -0.2969572 0.4985812
9 3 1 0.2909882 0.8504004
10 3 2 1.0957994 0.7365867
11 3 3 -0.2884501 0.1454566
12 3 4 0.4999331 0.7978971
tmp <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3), year = c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), var1 = c(NA, 0.754609745086276,
-0.424193528509845, 0.4056908200679, -0.804981499494056, 0.804924965958355,
NA, -0.2969572255706, 0.29098820839828, 1.09579940195461, -0.288450063674258,
0.499933144375212), var2 = c(0.563259549904615, 0.560994466999546,
NA, 0.589045349741355, 0.350428087171167, 0.481779781170189,
NA, 0.498581154504791, 0.850400378694758, 0.73658673488535, 0.145456639816985,
0.797897139331326)), .Names = c("ID", "year", "var1", "var2"), row.names = c(NA,
-12L), class = "data.frame")
我希望能够为每个ID适配每一列的线性模型,即:
tmp %>% group_by(ID) %>% lm(var1 ~ year, data = .)
tmp %>% group_by(ID) %>% lm(var2 ~ year, data = .)
我会使用这些模型的系数来填充每列中缺失的(NA
)值。以ID1和Variable 1为例,我会有如下的一个模型:
coefs_id1_var1 <- coef(lm(var1 ~ year, data = tmp[tmp$ID == 1, ]))
coefs_id1_var1[1] + coefs_id1_var1[2] * tmp[1, 2]
[1] -0.1341153
因此,ID 1变量1的缺失值将被替换为-0.134
。我的问题是我有很多变量需要这样做。我考虑使用lapply
并在ID上进行split
,或者可能使用mutate_each
,但是我还没有找到一种有效的方法来完成这个任务。有什么想法吗?
我目前的解决方案是
fillWithLinMod <- function(var, df) {
mod <- as.formula(paste0(var, " ~ year"))
coefs <- coef(lm(mod, data = df))
for (i in 1:nrow(df)) {
if (is.na(df[i, var])) {
df[i, var] <- coefs[1] + df[i, "year"] * coefs[2]
}
}
df[, var][[1]]
}
请注意,我的df是一个tibble
,这就是为什么我在末尾有子集的原因。
然后我可以使用以下内容:
tmp$var1 <- do.call("c", lapply(split(tmp, tmp$ID), function(x) fillWithLinMod("var1", x)))
tmp %>%split(。$ ID)%>%lapply(function(x)predict(lm(formula = var1〜year,x),x))%>%do.call(“c”,。)
- agenis