使用 R 中另一个变量的线性回归的斜率来估算单个变量的缺失数据
Posted
技术标签:
【中文标题】使用 R 中另一个变量的线性回归的斜率来估算单个变量的缺失数据【英文标题】:Impute missing data of a single variable using the slope of a linear regression of another variable in R 【发布时间】:2020-06-12 09:31:51 【问题描述】:这是我的数据集 (df8) 的摘录,其中包含 194 个国家/地区从 2000 年到 2018 年的时间序列。
iso3 year anc4 median
<chr> <dbl> <dbl> <dbl>
1 BIH 2000 NA 0.739
2 BIH 2001 NA 0.746
3 BIH 2002 NA 0.763
4 BIH 2003 NA 0.778
5 BIH 2004 NA 0.842
6 BIH 2005 NA 0.801
7 BIH 2006 NA 0.819
8 BIH 2007 NA 0.841
9 BIH 2008 NA 0.845
10 BIH 2009 NA 0.840
11 BIH 2010 0.842 0.856
12 BIH 2011 NA 0.873
13 BIH 2012 NA 0.867
14 BIH 2013 NA 0.889
15 BIH 2014 NA 0.879
16 BIH 2015 NA 0.883
17 BIH 2016 NA 0.854
18 BIH 2017 NA 0.891
19 BIH 2018 NA 0.920
20 BWA 2000 NA 0.739
21 BWA 2001 NA 0.746
22 BWA 2002 NA 0.763
23 BWA 2003 NA 0.778
24 BWA 2004 NA 0.842
25 BWA 2005 NA 0.801
26 BWA 2006 0.733 0.819
27 BWA 2007 NA 0.841
28 BWA 2008 NA 0.845
29 BWA 2009 NA 0.840
30 BWA 2010 NA 0.856
31 BWA 2011 NA 0.873
32 BWA 2012 NA 0.867
33 BWA 2013 NA 0.889
34 BWA 2014 NA 0.879
35 BWA 2015 NA 0.883
36 BWA 2016 NA 0.854
37 BWA 2017 NA 0.891
38 BWA 2018 NA 0.920
我想做的是使用基于区域中位数(中位数)的线性回归的斜率来估算变量 anc4 的缺失数据。我想在国家一级这样做,因为每个国家不属于同一个地区。
这是我尝试过的..
df_model <- df8
predictions <- vector()
for(i in unique(df_model$iso3))
temp <- df_model[df_model[,2]==i,]
predictions <- c(predictions,predict(lm(median~year,temp),df8[is.na(df8$anc4) & df8$iso3==i,]))
df8[is.na(df8$anc4),]$anc4 <- predictions
我使用了我在使用观察到的 anc4 数据点的线性回归来估算缺失的 anc4 数据时一直使用的代码,并尝试使用中位数对其进行调整..但效果不佳!
非常感谢!
【问题讨论】:
值得注意的是,lm(median~year+iso3, data=df_model) %>% summary
似乎说该区域在这里不是很相关,但这可能是示例绑定。
我只想根据中值画一条线并检索斜率并用它来估算国家/地区的缺失数据..
在您的示例中,每个区域只有 1 个非缺失值,是否总是如此?否则,您可能想多描述一下当有多个时会发生什么,因为斜率可能无法完美地连接它们。
1/ 当一个国家没有任何数据时,我们用区域中位数进行估算。 2/ 当一个国家至少有 2 个数据点时,我们根据该国观察到的数据使用线性回归进行估算。 3/ 但是当一个国家只有一个数据点时,我们需要使用基于区域中位数的线性回归的斜率。我已经做了前两个,现在我必须做第三个,所以这意味着所有的数据都已经为其他国家进行了估算。唯一没有估算数据的国家是只有一个数据点的国家(每个国家,而不是每个地区)。
【参考方案1】:
您的上一条评论清楚地说明了您的问题:您从中位数的线性回归中得到斜率,并从唯一的非缺失值中得到截距。
但是,您的代码中有一个相当严重的缺陷:您永远不应该在 for
循环内增长向量。使用*apply
函数,或者更好地使用purrr
包中的*map
函数。如果你有充分的理由使用for
循环,至少要预先分配它的大小。
由于您从模型外部获取截距,因此您不能在此处使用predict
。幸运的是,使用线性模型时,手动预测相当简单。
这是我使用dplyr
语法的解决方案。如果您不熟悉它,我建议您阅读它(例如there)
x=df_model %>%
group_by(iso3) %>%
mutate(
slope=lm(median~year)$coefficients["year"],
intercept=anc4[!is.na(anc4)]-slope*year[!is.na(anc4)],
anc4_imput = intercept+year*slope,
anc4_error = anc4-anc4_imput,
)
x
#> # A tibble: 38 x 8
#> # Groups: iso3 [2]
#> iso3 year anc4 median slope intercept anc4_imput anc4_error
#> <fct> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 BIH 2000 NA 0.739 0.00844 -16.1 0.758 NA
#> 2 BIH 2001 NA 0.746 0.00844 -16.1 0.766 NA
#> 3 BIH 2002 NA 0.763 0.00844 -16.1 0.774 NA
#> 4 BIH 2003 NA 0.778 0.00844 -16.1 0.783 NA
#> 5 BIH 2004 NA 0.842 0.00844 -16.1 0.791 NA
#> 6 BIH 2005 NA 0.801 0.00844 -16.1 0.800 NA
#> 7 BIH 2006 NA 0.819 0.00844 -16.1 0.808 NA
#> 8 BIH 2007 NA 0.841 0.00844 -16.1 0.817 NA
#> 9 BIH 2008 NA 0.845 0.00844 -16.1 0.825 NA
#> 10 BIH 2009 NA 0.84 0.00844 -16.1 0.834 NA
#> # ... with 28 more rows
#error is negligible
x %>% filter(!is.na(anc4))
#> # A tibble: 2 x 8
#> # Groups: iso3 [2]
#> iso3 year anc4 median slope intercept anc4_imput anc4_error
#> <fct> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 BIH 2010 0.842 0.856 0.00844 -16.1 0.842 1.22e-15
#> 2 BWA 2006 10.7 10.8 0.00844 -6.20 10.7 0.
#Created on 2020-06-12 by the reprex package (v0.3.0)
【讨论】:
这很简单!我还没有考虑过。我知道包裹,太棒了!非常感谢。以上是关于使用 R 中另一个变量的线性回归的斜率来估算单个变量的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用线性回归模型来预测(predict)单个样本的目标值(响应值response)实战
R语言广义线性模型函数GLMglm函数构建逻辑回归模型(Logistic regression)构建仿真数据集控制所有其它预测变量进而评估单个预测因子对结果概率的影响