统计软件第七次作业
处理缺失值(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']))