[R]_使用算法模型填充NA值(以线性回归为例)

        填充缺失值有很多种方法,比如用均值填充,用众数填充,今天介绍用算法模型的预测值填充的方法,包含两步骤,第一个是用已有的数据建模,第二个是用模型填充缺失值。这里以R里著名的iris数据集为例。

head(iris)

        数据集总共150行5列,前6行长这样

[R]_使用算法模型填充NA值(以线性回归为例)_第1张图片

         我们把数据集第一列的前20行设为na

iris$Sepal.Length[1:20]=NA

        新的数据集变成这样

[R]_使用算法模型填充NA值(以线性回归为例)_第2张图片

        但注意这里只是前20行没有值,后130行仍然有值,这时我们要做的是用Sepal.Width, Petal.Length, Petal.Width作为X构建一个线性回归模型去填充Sepal.Length。

        首先我们构建一个没有na的数据集。

library(dplyr)

iris_for_regression=iris%>%filter(Sepal.Length!="NA")

        去掉包含NA的行后,新的数据集130行5列,这时我们就可以用新的数据集构建一个线性回归模型了

model=lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,data=iris_for_regression)

        这就是一个常见的线性回归模型,模型构建好后,我们就可以用前20行Sepal.Width, Petal.Length, Petal.Width的数值去预测Sepal.Length的数值。

library(dplyr)

iris_new=iris%>%mutate_at(.,.vars = vars("Sepal.Length"),
          .funs=funs(ifelse(is.na(.),round(predict(model),2),.)))

        这里稍微解释下,.vars = vars("Sepal.Length") 是对Sepal.Length这列进行操作, .funs = funs(ifelse(is.na(.),round(predict(model),2),.)) 就是对Sepal.Length具体的操作方法,ifelse(is.na(.),round(predict(model),2),.) 意思就是如果是na值,我们就要模型的预测值predict(model)进行填充,如果不是na就保留原值,round(predict(model),2)的意思是对预测值保留2位小数。这时数据集前长这样。

[R]_使用算法模型填充NA值(以线性回归为例)_第3张图片

        我们可以看到,这时Sepal.Length前20行的值就是我们的模型的预测值,后130行依旧是我们的原值,这时我们就完成了用线性模型对na值的填充,可以对比图一,看看预测值的结果和原始值差异大不大。

        最后需要说明的是,这里只是一种简单的填充方法,如果按更高的标准设计算法,我们还需要考虑划分训练集和测试集,考虑诸如R^2之类的模型指标,如果用用更复杂的算法,还需要考虑对模型调参优化,感兴趣的朋友可以下来再自行学习。

你可能感兴趣的:(r语言,线性回归,python,算法)