如何使用R语言编写牛顿插值公式对缺失值进行插值

Python011

如何使用R语言编写牛顿插值公式对缺失值进行插值,第1张

LagrangePolynomial <- function(x,y) {

  len = length(x)

  if(len != length(y))

    stop("length not equal!")

   

  if(len < 2)

    stop("dim size must more than 1")

   

  #pretreat data abd alloc memery

  xx <- paste("(","a -",x,")")

  m <- c(rep(0,len))

   

  #combin express

  for(i in 1:len) {

    td <- 1

    tm <- "1"

    for(j in 1:len) {

      if(i != j) {

        td <- td*(x[i] - x[j])

        tm <- paste(tm,"*",xx[j])

      }

    }

    tm <- paste(tm,"/",td)

    m[i]<-tm #m[i] <- parse(text=tm)

  }

   

  #combin the exrpession

  m <- paste(m,"*",y)

  r <- paste(m,collapse="+")

   

  #combin the function

  fbody <- paste("{ return(",r,")}")

  f <- function(a) {}

   

  #fill the function's body

  body(f) <- parse(text=fbody)

   

  return(f)

}

这是拉格朗日多项式插值算法  你参考下吧

(1)计算已知类别数据及中的点与当前点的距离;

(2)按距离递增次序排序

(3)选取与当前点距离最小的k个点

(4)确定前K个点所在类别出现的频率

(5)返回频率最高的类别作为当前类别的预测

数据缺失必须被优先处理。如果是缺失的很少很少,无伤大雅,那么直接删了也没问题。除此之外,应该想办法补上它,i.e. 预测。

Little和Ruth(1987)把数据缺失的机制分为三类:

完全随机缺失(missing completely at random, MCAR)

所缺失的数据是完全随机的,缺失发生的概率既与已观察到的数据无关,也与未观察到的数据无关。这是一种比较理想的情况。

随机缺失(missing at random, MAR)

数据的缺失不是完全随机的。缺失数据发生的概率与所观察到的变量是有关的,而与未观察到的数据的特征是无关的。这是一个比较严重的问题,在这种情况下,我们需要进一步检查数据收集过程,并尝试了解数据为什么丢失。 例如,如果在一项问卷调查中,大多数人没有回答某个问题,他们为什么这么做,是问题不清楚吗?

不可忽略的缺失(non-ignorable missing ,NIM)

亦称为非随机缺失(not missing at random, NMAR),也有研究者将其称为MNAR(missing not at random)。 缺失数据不仅依赖于其它变量,又依赖于变量本身,这种缺失即为不可忽略的缺失。

一般MAR碰见多一些。在R语言中,非常容易搞定。只需要用mice库。更多应用请参考帮助文档。 http://www.stefvanbuuren.nl/publications/MICE%20V1.0%20Manual%20TNO00038%202000.pdf

mice是链式方程多元插值的简写(Multivariate Imputation by Chained Equations)。R中有个同名包提供了多种先进的缺失值处理方法。它使用一种颇不常见的方法来进行两步插值:先利用mice函数建模再用complete函数生成完整数据。效果非常的好,令人惊讶。 注意mice库假设数据缺失为MAR。

下面的程序使用mice库自带的数据nhanes

这篇文章 https://datascienceplus.com/imputing-missing-data-with-r-mice-package/ 讨论了更多mice库的应用,但是最基础的也就是这些了。