共计 3577 个字符,预计需要花费 9 分钟才能阅读完成。
原文链接:http://tecdat.cn/?p=24152
什么是 PCR?(PCR = PCA + MLR)
• PCR 是解决许多 x 变量的回归技术
• 给定 Y 和 X 数据:
• 在 X 矩阵上进行 PCA
– 定义新变量:主成分(分数)
• 在 多元线性_回归_(_MLR_) 中应用这些新变量中的一些来建模 / 预测 Y
• Y 可能是单变量或多变量。
例子
# 对数据
set.seed(123)
da1 <- marix(c(x1, x2, x3, x4, y), ncol = 5, row = F)
多元线性回归和逐渐剔除变量,手动:
# 对于 data1:(正确的程序将依据模仿状况而扭转)。lm(y ~ x1 + x2 + x3 + x4)
lm(y ~ x2 + x3 + x4)
lm(y ~ x2 + x3)
lm(y ~ x3)
配对关系图
pais(atix, ncol = 5, byrow = F
如果反复:
# 对于 data2:
lm(y ~ x1 + x2 + x3 + x4)
lm(y ~ x1 + x2 + x4)
lm(y ~ x2 + x4)
lm(y ~ x2)
数据集 2 的绘图:
应用四个 x 的均值作为单个变量来剖析两个数据集:
xn1 <- (dt1\[,1\] + a1\[,2\] + at1\[,3\] + dt1\[,4\])/4
lm(data1\[,5\] ~ xn1)
lm(data2\[,5\] ~ xn2)
检查一下 X 数据的 PCA 的载荷 loading 是什么。
# 简直所有的方差都在第一主成分解释。prnmp(dt1\[,1:4\])
# 第一个成分的载荷
picp(dta1\[,1:4\])$lads\[,1\]
它们简直雷同,以至于第一个主成分实质上是四个变量的平均值。让咱们保留一些预测的 beta 系数 – 一组来自数据 1 的残缺集和一组来自均值剖析的:
c1 <- smry(lm(dta1\[,5\] ~ dta1\[,1\] + dta1\[,2\] + ata1\[,3\] +
dt1\[,4\]))$coficns\[,1\]
f <- summry(rm2)$cefets\[,1\]
咱们当初模仿三种办法(残缺模型、均值(=PCR)和单个变量)在 7000 次预测中的体现:
# 对预测进行模仿。误差 <- 0.2
xn <- (x1 + x2 + x3 + x4)/4
yt2 <- cf\[1\] + cf\[2\] * xn
yht3 <- cf\[1\] + cf\[2\] * x3
bro(c(um((y-hat)^2)/7000 min = "均匀预测误差平方")
PCR 剖析误差最小。
示例:光谱类型数据
构建一些人工光谱数据:(7 个观测值,100 个波长)
# 光谱数据实例
mapot(t(spcra) )
mtlnes(t(spcra))
均匀光谱表明:
mtpot(t(secra))
malies(t(spcta))
mnp <- apply(spcra, 2, mean)
lines(1:100, mnp, lwd = 2)
均匀核心光谱:
spcamc<-scae(spcta,scale=F)
plot(t(spermc),tpe="")
标准化光谱:
sptracs<-scale(spetra,scale=T,center=T)
matott(specrams),tye="n",
matlies(t(sectramcs))
# 用特征函数对相关矩阵做 PCA。pcaes <- eien(cor(spra))
ladigs <- pces$vectors\[,1\].
score <- peramcs%*%t(t(lodis1))
pred <- soes1 %*% loadings1
## 1-PCA 预测值转换为原始尺度和平均值。mtrx(repeasp, 7), nro=7, brw=T)
在单个概览图中收集的所有图:
par(mfrow = c(3, 3)
matlot(t(sectr)
PCR 是什么?
• 数据状况:
• 用 A 主成分 t1、t2… 做 MLR 而不是所有(或局部)x。
• 多少个成分:通过穿插验证确定。
怎么做?
1. 摸索数据
2. 进行建模(抉择主成分数量,思考变量抉择)
3. 验证(残差、异样值、影响等)
4. 迭代 2. 和 3。
5. 解释、总结、报告。
6. 如果相干:预测将来值。
穿插验证
• 疏忽一部分察看值
• 在残余(缩小的)数据上拟合模型
• 预测模型脱漏的察看值:yˆi,val
• 对所有察看值顺次执行此操作并计算总体模型性能:
(预测的均方根误差)
最初:对所有抉择的重量(0、1、2、…、…)进行穿插验证并绘制模型性能
barplot(names.arg)
抉择最佳成分数:
• 总体误差最小的主成分。
重采样
• 穿插验证 (CV)
•留一法 (_Leave-On_e-_Out_, 简称 LOO)
• Bootstrapping
• 一个很好的通用办法:
– 将数据分成训练集和测试集。
– 在训练数据上应用穿插验证
– 查看测试集上的模型性能
– 可能:反复所有这些屡次(反复双穿插验证)
穿插验证 – 准则
• 最小化预期预测误差:
平方预测误差 = Bias2 + 方差
• 包含“许多”PC 主成分:低偏差,但高方差
• 包含“很少”PC 主成分:高偏差,但低方差
• 抉择最佳折衷!
验证 – 存在于不同的级别
1. 分为 3 个:训练(50%)、验证(25%)和测试(25%)
2. 拆分为 2:校准 / 训练 (67%) 和测试 (33%)
训练中,CV/bootstrap •更罕用
3. 没有 “ 固定宰割 ”,而是通过 CV/bootstrap 重复宰割,而后在每个训练组内进行 CV。
4. 没有宰割,但应用(一级)CV/bootstrap。
5. 只对所有数据进行拟合 – 并查看误差。
示例:汽车数据
# 例子:应用汽车数据。# 将 X 矩阵定义为数据框中的一个矩阵。mtas$X <- as.ix(mcas\[, 2:11\])
# 首先,咱们思考随机抉择 4 个属性作为测试集
mtcrs_EST<- mtcrs\[tcars$rai == FASE,\]。tcaTRAIN <- mtars\[tcarstrai == TUE,\]。
当初所有的工作都在 训练数据集上进行。
摸索数据
咱们之前曾经这样做了,所以这里不再赘述
数据建模
应用 pls 软件包以最大 / 大量的主成分运行 PCR。
# 应用 pls 软件包,以最大 / 较大的成分数运行 PCR。pls(lomg ~ X , ncop = 10, dta = marsTRAN,
aliaon="LOO")
初始图集:
# 初始化的绘图集。par(mfrow = c(2, 2)
plot(mod)
主成分的抉择:
# 主成分的抉择。# 分段的 CV 会失去什么。modseCV <- pcr(lomg ~ X , ncp = 10, dta = marTIN
vai ="CV"
)
# 初始图集。par(mfrow = c(1, 2))
plot(odsC, "vadaion")
让咱们看看更多的主成分:
# 让咱们看看更多的主成分。# 分数。scre(mod)
# 负荷
loading(md,cms = 1:4)
咱们抉择 3 个主成分:
# 咱们抉择 4 个成分
m <- ncmp = 3, data = mrs_TAI vdon = "LOO", akknie = RUE
而后:验证:
让咱们验证更多:应用 3 个主成分。咱们从中获取预测的残差,因而这些是(CV)验证版本!
oit <- ppo(mod3, whih = "litin")
plot(obft\[,2\], Rsds)
# 为了绘制残差与 X - 杠杆的比照,咱们须要找到 X - 杠杆。# 而后找到杠杆值作为 Hat 矩阵的对角线。# 基于拟合的 X 值。Xf <- sors(md3)
plot(lvge, abs(Rsidals))
text(leage, abs(Reuls))
# 让咱们也绘制一下残差与每个输出 X 的关系。for (i in 2:11){plot(res~masAN\[,i\],type="n")
}
解释 / 论断
当初让咱们看一下后果——“解释 / 论断”:
# 当初咱们来看看后果 - 4) "解释 / 论断"
par(mfrw = c(2, 2))
# 绘制具备 Jacknife 不确定性的系数。obfi <- red(mod3,, wich = "vltn)
abe(lm(ft\[,2\] ~ fit\[,1\])
plt(mo3, ses = TUE,)
# 最初是一些输入
test(mo3, nm = 3)
预测
# 当初让咱们试着预测 TEST 集的 4 个数据点。prdit(md3, nwaa =TEST)
plt(TEST$lgg, pes)
rmsep <- sqrt(men(log - prd)^2))
rmsep