R:跨矩阵/横向/跨矩阵的样条

时间:2014-10-13 23:24:21

标签: r matrix interpolation spline

我有一个与此类似的矩阵:

    1    2   3    4    5
a  1.4  NA  2.3  0.2  NA
b  NA   3.2 1.2   NA  NA
c  3.5  NA   NA   NA  NA
d  2.1  1.9  NA   NA  NA

我需要在矩阵中插入NA。当我指定哪一行时,我能够做到:

fmm = spline(x = 1:5, y = RatioNA[1,1:5], xout = 1:5, method = "fmm")

但是我不能同时为整个桌子做这件事。

另外,它不是为每一行执行,而是为每一列执行此操作。也就是说,它不使用(1.4,NA,2.3,0.2,NA)进行插值,而是使用(1.4,NA,3.5,2.1)。我需要前者。

如何在不指定哪一行的情况下每行而不是列来获取样条线?

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用na.spline的{​​{1}}个zoo包在场景后使用splinefun。它可以为矩阵进行插值,或者更精确地为具有coredate矩阵的多变量时间序列进行插值。 但是,您应首先创建带有一些虚拟日期的多变量时间序列。

library(zoo)
mm <- read.table(text='    1    2   3    4    5
a  1.4  NA  2.3  0.2  NA
b  NA   3.2 1.2   NA  NA
c  3.5  NA   NA   NA  NA
d  2.1  1.9  NA   NA  NA',header=TRUE)


## na.spline interpolate by column so you should transpose
d0 <- as.Date("2000-01-01")
vv = na.spline(zoo(t(mm),d0+seq_len(ncol(mm))), na.rm = FALSE)
## you transpose again to get you matrix
t(coredata(vv))

#    X1  X2  X3   X4   X5
# a 1.4 2.7 2.3  0.2 -3.6
# b 5.2 3.2 1.2 -0.8 -2.8
# c 3.5 3.5 3.5  3.5  3.5
# d 2.1 1.9 1.7  1.5  1.3

答案 1 :(得分:0)

您可以使用apply函数为矩阵的每一行或每列执行指定的函数

样本数据

*txt="    1    2   3    4    5
a  1.4  NA  2.3  0.2  NA
b  NA   3.2 1.2   NA  NA
c  3.5  NA   NA   NA  NA
d  2.1  1.9  NA   NA  NA"
df=read.table(text=txt,header=T)*

样本计算

fmm = spline(x = 1:5, y = df[1,1:5], xout = 1:5, method = "fmm")

计算每一行的功能

myFun<-function(yrow){
  fmm = spline(x = 1:5, y = yrow, xout = 1:5, method = "fmm")
  return(fmm$y)
}

评估矩阵的每一行。注意,需要转置,因为“apply”的输出是列向量。

df_interp <- t(apply(df, 1, myFun))

产生的输出

df_interp
  [,1] [,2] [,3] [,4] [,5]
a  1.4  2.7  2.3  0.2 -3.6
b  5.2  3.2  1.2 -0.8 -2.8
c  3.5  3.5  3.5  3.5  3.5
d  2.1  1.9  1.7  1.5  1.3