是否有一种方法来自动填充空单元格在R使用前值的线性回归的每个数据子集?



我有一个包含"Wood"每个国家2000年至2016年的年度数据,但缺少2017年至2020年的值:

10789 1123411567123451432115446nananana37297456

有两种方法可以返回相同的结果,但精度不超过浮点数。

1使用Country作为因子

最简单的方法是使用国家作为回归量,只拟合一个模型。由于有些国家没有木材数据,我将仅为有数据的国家定义一个值为TRUE的逻辑索引。这将消除其他。

i <- as.logical(ave(df1$Wood, df1$Country, FUN = (x) !all(is.na(x))))
fit <- lm(Wood ~ Year + Country, data = df1, na.action = na.exclude)
ypred <- predict(fit, newdata = df1[i & is.na(df1$Wood), ])

2按国家划分数据,并拟合单独的模型。

如果数据按国家划分,并且每个子集适合不同的模型,则预测值几乎相同。它只会给你更多的工作。

逻辑指数再次用于仅保存具有木材数据的国家。

sp <- split(df1[i,], df1[i, "Country"])
ypred2_list <- lapply(sp, (X){
fit <- lm(Wood ~ Year, X, na.action = na.exclude)
predict(fit, newdata = X[is.na(X$Wood), ])
})

3比较结果

现在看到数值结果不是identical而是all.equal

identical(ypred, unlist(unname(ypred2_list)))
#[1] FALSE
all.equal(ypred, unlist(unname(ypred2_list)))
#[1] TRUE

的差异非常小。

ypred - unlist(unname(ypred2_list))
#           7            8            9           10           27 
#1.164153e-10 1.164153e-10 2.328306e-10 1.164153e-10 1.873559e-10 
#          28           29           30           47           48 
#1.891749e-10 3.055902e-10 1.891749e-10 1.873559e-10 1.891749e-10 
#          49           50 
#3.055902e-10 1.891749e-10 

4分配结果。

df1$Wood[i & is.na(df1$Wood)] <- ypred