第七次作业

统计软件第七次作业

处理缺失值(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']))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值