使用 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) %&gt;% 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 中线性回归模型中斜率的 95% 置信区间

线性回归——最小二乘法

R线性回归模型构建示例

R线性回归模型构建:残差值回归值预测域置信区间

R语言使用线性回归模型来预测(predict)单个样本的目标值(响应值response)实战

R语言广义线性模型函数GLMglm函数构建逻辑回归模型(Logistic regression)构建仿真数据集控制所有其它预测变量进而评估单个预测因子对结果概率的影响