B题:玉米营养品质的快速鉴定的R实现(直接调用pls包)
setwd("E:/R_data/近红外测玉米三种物质含量")
library(pls)
### 一.读取波普数据
###数据在EXCEL表内转置, 每行代表一个样本
data=read.csv('光谱数据和生化检测数据.csv',
header=TRUE,
row.names=1)
#建模数据有100个
dat=data[1:100,]
head(dat)
#随机挑选75个训练集
set.seed(28)
train=sample(1:100, 75)
#检验集
test=(-train)
####
###方法一. 主成分分析--蛋白质含量预测
set.seed(123)
pcr.fit=pcr(蛋白含量 ~ . , data=dat[,1:391], subset=train,
validation="CV")
summary(pcr.fit)
#选取最佳主成分个数
validationplot(pcr.fit, val.type='MSEP')
#最佳主成分个数选为14
#检验蛋白质含量预测效果
pcr.pred=predict(pcr.fit, newdata=dat[,1:390][test,], ncomp=14)
#预测效果--均方误差
mean((dat['蛋白含量'][test]-pcr.pred)^2)
range=range(dat['蛋白含量'][test],pcr.pred)
plot(dat['蛋白含量'][test],pcr.pred,
xlim=range, ylim=range,
xlab='蛋白含量实际值',ylab='预测值',
main='蛋白质含量预测\n主成分回归')
abline(a=0,b=1,col='red')
#####
###方法二. 偏最小二乘法--蛋白质含量预测
set.seed(123)
pls.fit=plsr(蛋白含量 ~ . , data=dat[,1:391],subset=train,
validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分为5或9
pls.pred1=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=5)
#预测效果--均方误差
d1=mean((dat['蛋白含量'][test]-pls.pred1)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['蛋白含量'][test],pls.pred)
plot(dat['蛋白含量'][test],pls.pred,
xlim=range,ylim=range,
xlab='蛋白含量实际值',ylab='预测值',
main='蛋白质含量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
#####
###偏最小二乘法--脂肪含量预测
pls.fit=plsr(脂肪含量 ~ . , data=dat[,c(1:390,393)],
subset=train, validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分为5或9
pls.pred2=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=13)
#预测效果--均方误差
d2=mean((dat['脂肪含量'][test]-pls.pred2)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['脂肪含量'][test],pls.pred)
plot(dat['脂肪含量'][test],pls.pred,
xlim=range, ylim=range,
xlab='脂肪含量实际值',ylab='预测值',
main='脂肪含量量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
#####
###偏最小二乘法--纤维素含量预测
pls.fit=plsr(纤维素含量 ~ . , data=dat[,c(1:390,392)],subset=train,
validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分个数是5
pls.pred3=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=5)
#预测效果--均方误差
d3=mean((dat['纤维素含量'][test]-pls.pred3)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['纤维素含量'][test],pls.pred)
plot(dat['纤维素含量'][test],pls.pred,
xlim=range,ylim=range,
xlab='纤维素含量实际值',ylab='预测值',
main='纤维素含量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
####多元偏最小二乘法
###同时预测三种物质的含量
#数据归类整理
dat2=dat
dat2$y=as.matrix(dat[,391:393])
dat2=dat2[,-(391:393)]
pls.fit3=plsr(y ~ ., data=dat2, subset=train, validation="CV")
summary(pls.fit3)
validationplot(pls.fit3, val.type='MSEP')
##the best ncomp=7
pls.pred=predict(pls.fit3, newdata=dat2[test,], ncomp=7)
# 3种物质的预测效果--均方误差
apply(((dat2$y)[test,] - as.data.frame(pls.pred))^2,2,mean)
#单个预测的效果--均方误差
c(d1,d2,d3)
library(pls)
### 一.读取波普数据
###数据在EXCEL表内转置, 每行代表一个样本
data=read.csv('光谱数据和生化检测数据.csv',
header=TRUE,
row.names=1)
#建模数据有100个
dat=data[1:100,]
head(dat)
#随机挑选75个训练集
set.seed(28)
train=sample(1:100, 75)
#检验集
test=(-train)
####
###方法一. 主成分分析--蛋白质含量预测
set.seed(123)
pcr.fit=pcr(蛋白含量 ~ . , data=dat[,1:391], subset=train,
validation="CV")
summary(pcr.fit)
#选取最佳主成分个数
validationplot(pcr.fit, val.type='MSEP')
#最佳主成分个数选为14
#检验蛋白质含量预测效果
pcr.pred=predict(pcr.fit, newdata=dat[,1:390][test,], ncomp=14)
#预测效果--均方误差
mean((dat['蛋白含量'][test]-pcr.pred)^2)
range=range(dat['蛋白含量'][test],pcr.pred)
plot(dat['蛋白含量'][test],pcr.pred,
xlim=range, ylim=range,
xlab='蛋白含量实际值',ylab='预测值',
main='蛋白质含量预测\n主成分回归')
abline(a=0,b=1,col='red')
#####
###方法二. 偏最小二乘法--蛋白质含量预测
set.seed(123)
pls.fit=plsr(蛋白含量 ~ . , data=dat[,1:391],subset=train,
validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分为5或9
pls.pred1=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=5)
#预测效果--均方误差
d1=mean((dat['蛋白含量'][test]-pls.pred1)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['蛋白含量'][test],pls.pred)
plot(dat['蛋白含量'][test],pls.pred,
xlim=range,ylim=range,
xlab='蛋白含量实际值',ylab='预测值',
main='蛋白质含量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
#####
###偏最小二乘法--脂肪含量预测
pls.fit=plsr(脂肪含量 ~ . , data=dat[,c(1:390,393)],
subset=train, validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分为5或9
pls.pred2=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=13)
#预测效果--均方误差
d2=mean((dat['脂肪含量'][test]-pls.pred2)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['脂肪含量'][test],pls.pred)
plot(dat['脂肪含量'][test],pls.pred,
xlim=range, ylim=range,
xlab='脂肪含量实际值',ylab='预测值',
main='脂肪含量量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
#####
###偏最小二乘法--纤维素含量预测
pls.fit=plsr(纤维素含量 ~ . , data=dat[,c(1:390,392)],subset=train,
validation="CV")
summary(pls.fit)
validationplot(pls.fit, val.type='MSEP')
#最佳主成分个数是5
pls.pred3=predict(pls.fit, newdata=dat[,1:390][test,], ncomp=5)
#预测效果--均方误差
d3=mean((dat['纤维素含量'][test]-pls.pred3)^2)
##结果和主成分回归差不多, 但是主成分的个数明显减少.
range=range(dat['纤维素含量'][test],pls.pred)
plot(dat['纤维素含量'][test],pls.pred,
xlim=range,ylim=range,
xlab='纤维素含量实际值',ylab='预测值',
main='纤维素含量预测\n偏最小二乘法')
abline(a=0,b=1,col='red')
####多元偏最小二乘法
###同时预测三种物质的含量
#数据归类整理
dat2=dat
dat2$y=as.matrix(dat[,391:393])
dat2=dat2[,-(391:393)]
pls.fit3=plsr(y ~ ., data=dat2, subset=train, validation="CV")
summary(pls.fit3)
validationplot(pls.fit3, val.type='MSEP')
##the best ncomp=7
pls.pred=predict(pls.fit3, newdata=dat2[test,], ncomp=7)
# 3种物质的预测效果--均方误差
apply(((dat2$y)[test,] - as.data.frame(pls.pred))^2,2,mean)
#单个预测的效果--均方误差
c(d1,d2,d3)
-
momo 赞了这篇日记 2015-05-21 23:05:02