用spline做三次样条插值,当需插值列从第一个开始有多个缺失值,后面有非缺失值。但发现得到结果非预期。得到的结果跟非缺失值完全不一样,非缺失的值多在2000-4000,而插值出的值为1-197。
就想问哪不对,怎么才能改成插值出正确的值呢?
下面是我写的:
setwd("D:/1211")
a = list.files("noabnormal")
dir2 = paste("./noabnormal/",a,sep="")
new_dir2=paste("./noqueshiz/",a,sep="")
n = length(dir2)
library(zoo)
i=1
while(i<=n){
b = read.table(file = dir2[i], header=T)
m <- sum(is.na(b$PUPIL_SIZE))
sp<- split(b,b$photo)
k<-length(sp) #计算有多少个trial
j=1
while (j<=k) {
wz<-which(is.na(sp[[j]]$PUPIL_SIZE))
if(length(wz)==0|length(wz)>0.5*length(sp[[j]]$PUPIL_SIZE)) j+1 else
t<- spline(x=sp[[j]]$PUPIL_SIZE,y=sp[[j]]$TIMESTAMP, xout=which(is.na(sp[[j]][3])),method="fmm")
j=j+1
}
usp<- unsplit(sp,b$photo)
write.table(usp,file=new_dir2[i],append=TRUE)
i=i+1
}
我用R语言里akima包里的interp函数做spline插值,做出来的结果也不对,想找其他替代函数纠正,根本就没有,搞得很棘手。项目卡死在那儿了。
NND,开源语言不靠谱体现的淋漓尽致。
我把我的问题也post在这儿吧:
library(base)
library(graphics)
library(stringr)
library(data.table)
library(stats)
library(rJava)
library(xlsx)
library(xlsxjars)
library(readxl)
library(openxlsx)
library(stringi)
library(akima)
library(grDevices)
library(fields)
library(Hmisc)
library(sp)
library(utils)
library(pointr)
library(fBasics)
setwd('The path under which you store the numericValue.csv')
numericValue<-read.csv("numericValue.csv",header=TRUE)
head(numericValue)
dim(numericValue)
Xrange <- max(numericValue$X)-min(numericValue$X)
Yrange <- max(numericValue$Y)-min(numericValue$Y)
Zrange <- max(numericValue$Z)-min(numericValue$Z)
Xrange
Yrange
Zrange
Xmax<-ifelse(max(numericValue$X)==0,0.1*abs(Xrange),round(max(numericValue$X)+0.1*abs(Xrange),1))
Xmin<-ifelse(min(numericValue$X)==0,-0.1*abs(Xrange),round(min(numericValue$X)-0.1*abs(Xrange),1))
Xmax
Xmin
Ymax<-ifelse(max(numericValue$Y)==0,0.1*abs(Yrange),round(max(numericValue$Y)+0.1*abs(Yrange),1))
Ymin<-ifelse(min(numericValue$Y)==0,-0.1*abs(Yrange),round(min(numericValue$Y)-0.1*abs(Yrange),1))
Ymax
Ymin
## linear=TRUE & linear=FALSE makes big differences
interplinearS<-interp(numericValue$X,numericValue$Y,numericValue$Z, nx=500, ny=500, linear=TRUE, duplicate='mean')
interpsplineS<-interp(numericValue$X,numericValue$Y,numericValue$Z, nx=500, ny=500, linear=FALSE, duplicate='mean')
interplinearS$x
interpsplineS$x
interplinearS$y
interpsplineS$y
## z in interplinearS & interpsplineS show the big differences
interplinearS$z
interpsplineS$z
#plot image
colors<-colorRampPalette(c('#00FF00', '#00CD66', '#43CD80', '#B3EE3A', '#FF6347', '#FF4500', '#FF0000'))(8)
colors
lgnd = 1
lgndmar = 5.1
lgnd
lgndmar
image.plot(interpsplineS,col=colors,main='X-Y-Z-Spline',col.main='black',xlim=c(Xmin,Xmax),ylim=c(Ymin,Ymax),
xlab="X",ylab="Y",legend.shrink=lgnd,legend.width=lgnd,legend.mar=lgndmar,horizontal=FALSE)
image.plot(interplinearS,col=colors,main='X-Y-Z-Linear',col.main='black',xlim=c(Xmin,Xmax),ylim=c(Ymin,Ymax),xlab='X',ylab='Y',
legend.shrink=1,legend.width=1,legend.mar=5.1,horizontal=FALSE)
使用的数据是:
很不好意思,傻CSDN没有上传数据选项,只能截图上传上来,幸好数据不多,可以感兴趣的大牛进行测试和提出修改意见建议。
请问大家是否找到解决办法了