第七次作业

来源:互联网 发布:香港网络的英文缩写 编辑:程序博客网 时间:2024/05/16 01:06

统计软件第七次作业

处理缺失值(knn和相关性)

第一题

利用变量间的相关性借补时,由于会发生最相关的变量对应位置处的观测值也恰好缺失的情形,所以请将这样的情形也考虑在内,即考虑用能借补的那些变量中相关性最大的那个即可。

代码

library(DMwR)data(algae)head(algae)algae1<-algae[manyNAs(algae,0),]algae2<-algae[-manyNAs(algae,0),]symnum(cor(algae2[,4:18]))cor(algae2[,c(5,6,10)])lm1<-lm(PO4~oPO4,data=algae2)lm2<-lm(PO4~mnO2,data=algae2)f1<-function(x) {  if(is.na(x))return(NA) else {a<-47.08+1.271*x  }  return(a)}f2<-function(x) {  if(is.na(x))return(NA)  else {a<-371-24.88*x  }  return(a)}algae1[is.na(algae1$PO4),'PO4']<-sapply(algae1[is.na(algae1$PO4),'oPO4'],f1)algae1[is.na(algae1$PO4),'PO4']<-sapply(algae1[is.na(algae1$PO4),'mnO2'],f2)

第二题

在最近邻( KNN )方法中,采用只考虑借助于没有缺失的案例(Cases)的情形。

代码

library(DMwR)head(algae)dm<-function(x){  x<-x[!is.na(x[,'NH4']),]  x<-x[!is.na(x[,'oPO4']),]  d<-matrix(rep(NA,nrow(x)^2),nrow(x))  for(i in 1:nrow(x)){for(j in 1:nrow(x)){  d[i,j]<-sqrt((x[i,'NH4']-x[j,'NH4'])^2+(x[i,'oPO4']-x[j,'oPO4'])^2)}  }  return(d)}kn<-function(i,x,k=11){    if(i>nrow(x)) return(nrow(x)+1)  else d<-order(x[i,])[2:(k+1)]  return(d)}knn<-function(x,k=11){  d1<-dm(x)    for(i in which(is.na(x[,'PO4']))){d2<-kn(i,d1,k=k)x[i,'PO4']<-mean(x[d2,'PO4'],na.rm=T)  }  return(x)}dm1<-function(x){  x<-x[!is.na(x[,'mxPH']),]  x<-x[!is.na(x[,'mnO2']),]  d<-matrix(rep(NA,nrow(x)^2),nrow(x))  for(i in 1:nrow(x)){for(j in 1:nrow(x)){  d[i,j]<-sqrt((x[i,'mxPH']-x[j,'mxPH'])^2+(x[i,'mnO2']-x[j,'mnO2'])^2)}  }  return(d)}knn1<-function(x,k=11){  a<-knn(x)  a1<-dm1(a)for(i in which(is.na(a[,'PO4']))){d2<-kn(i,a1,k=k)a[i,'PO4']<-mean(a[d2,'PO4'],na.rm=T)  }  return(a)}

运行

which(is.na(knn1(algae)[,'PO4']))
0 0