10789
1123411567123451432115446nananana37297456
1使用
我有一个包含"Wood"每个国家2000年至2016年的年度数据,但缺少2017年至2020年的值:
有两种方法可以返回相同的结果,但精度不超过浮点数。
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