在R中使用LOESS拟合2D曲面

5

我希望使用LOESS平滑法处理嘈杂的2D数据,以找到更平滑的2D曲面。该数据以数据框或r行c列的矩阵形式存在。'asbio'包可以绘制n*n数据的曲面图,而我可以使用统计基础包中的'loess'进行1D拟合,但我无法弄清如何进行2D绘图。

library(rgl)


age <- 1:100
year <- 1959:2012
z<- data.frame(matrix(array(0, length(age)*length(year)),nrow=length(age), ncol=length(year)))
rownames(z) <- age
colnames(z) <- year
distYear <- dnorm(1:length(year), 26, 10)
distAge <- dnorm(age, 50, 15)
for(theYear in year){
  #for(theAge in age){
    z[,theYear-year[1]+1] <- as.numeric(distYear[theYear-year[1]+1]*distAge*runif(length(age))*50000)
  #}
}
z<- data.matrix(z)
z <- data.frame(z)
colnames(z) <- year

# First define the colours for the Z values.
zlim <- range(z)    
zlen <- zlim[2] - zlim[1] 
scale <- 20/zlen
colorlut <- terrain.colors(20,alpha=1.0) # height color lookup table
col <- colorlut[ (t(as.matrix(z))-zlim[1])*scale+1 ] # assign colors to heights for each point.


surface3d(age,year,as.matrix(z), col=col)

loess(z~age+year,data=data.frame(z))

我收到一个错误,拒绝了data.frame作为列表,但我怀疑问题不止于此。在寻找信息时,我只能找到一维线性描述。
有人可以帮忙吗?
1个回答

6

已解决...

需要将数据框或矩阵转换为三列数据框。 一旦创建了上面的数据框z,以下内容将平滑并显示它(使用rgl)。

open3d(useFreeType=par3d("useFreeType"))
surface3d(age,year,as.matrix(z), col=col)

zz <- z 
zz$Ages <- rownames(z)
zzx <- melt(zz, id.vars="Ages", value.name="Vals")

theResult <-     loess(Vals~as.numeric(Ages)+as.numeric(variable),data=data.frame(zzz))
resultTable <- matrix(theResult$fitted, nrow=length(age), length(year))

open3d(useFreeType=par3d("useFreeType"))
surface3d(age,year,as.matrix(resultTable), col=col)

1
我认为这是一个非常有用的问题,答案也很有用。如果您能说明如何使用loess对象的“predict”方法,那就更好了。我同意这样做可能有点困难,因为2D loess拟合的示例不容易找到,所以许多人并不知道其功能。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接