Интерполяция данных в R
предположим, что у меня есть матрица 3 на 5 в R:
4 5 5 6 8
3 4 4 5 6
2 3 3 3 4
Я бы хотел, чтобы интерполировать между этими значениями, чтобы создать матрицу размером 15 на 25. Я также хотел бы указать, является ли интерполяция линейной, гауссовой и т. д. Как я могу это сделать?
например, если у меня есть такая маленькая матрица
2 3
1 3
и я хочу, чтобы он стал 3 на 3, то это может выглядеть как
2 2.5 3
1.5 2.2 3
1 2 3
2 ответов
app <- function(x, n) approx(x, n=n)$y # Or whatever interpolation that you want
apply(t(apply(x, 1, function(x) app(x, nc))), 2, function(x) app(x, nr))
[,1] [,2] [,3]
[1,] 2.0 2.50 3
[2,] 1.5 2.25 3
[3,] 1.0 2.00 3
давным-давно я написал подобную игрушку, за исключением того, что я никогда не удосужился определить функцию интерполяции. Есть также raster::disaggregate
.
zexpand<-function(inarray, fact=2, interp=FALSE, ...) {
# do same analysis of fact to allow one or two values, fact >=1 required, etc.
fact<-as.integer(round(fact))
switch(as.character(length(fact)),
'1' = xfact<-yfact<-fact,
'2'= {xfact<-fact[1]; yfact<-fact[2]},
{xfact<-fact[1]; yfact<-fact[2];warning(' fact is too long. First two values used.')})
if (xfact < 1) { stop('fact[1] must be > 0') }
if (yfact < 1) { stop('fact[2] must be > 0') }
bigtmp <- matrix(rep(t(inarray), each=xfact), nrow(inarray), ncol(inarray)*xfact, byr=T) #does column expansion
bigx <- t(matrix(rep((bigtmp),each=yfact),ncol(bigtmp),nrow(bigtmp)*yfact,byr=T))
# the interpolation would go here. Or use interp.loess on output (won't
# handle complex data). Also, look at fields::Tps which probably does
# a much better job anyway. Just do separately on Re and Im data
return(invisible(bigx))
}