楼主: zhangxl121
10090 5

偏最小二乘回归做预测 [推广有奖]

  • 0关注
  • 0粉丝

高中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
189 点
帖子
15
精华
0
在线时间
15 小时
注册时间
2009-4-19
最后登录
2014-5-5

楼主
zhangxl121 发表于 2010-3-14 20:15:06 |AI写论文
5论坛币
在R软件中,假若模拟出X和Y矩阵,则通过偏最小二乘回归可得到一个Y关于成分T的回归式。现在遇到的问题是,假如我生成100组数据做模拟回归,再生成50组数据想用拟合的回归方程做预测,不知道在R软件中这些该如何编写程序,R中有一个predict()命令,但是却老出问题,说“newdata中有50行而变量中有100行”。很是苦恼。急求大师帮忙啊

关键词:偏最小二乘回归 偏最小二乘 最小二乘 predict 回归方程 预测 最小二乘

沙发
epoh 发表于 2010-3-15 09:43:40
不会错的方法,就是参考data : yarn
最后加一column "train"
train : Logical vector with TRUE for the training samples
         and FALSE for the test samples

TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  
TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  
TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
FALSE FALSE FALSE FALSE FALSE FALSE FALSE

21 for training(data),
7 for testing(newdata).

library(pls)
data(yarn)
nir.mvr <- mvr(density ~ NIR, ncomp = 5, data = yarn[yarn$train,])
predict(nir.mvr, comps = 1:4, newdata = yarn[!yarn$train,])


要不然predictdata,若要分开模拟的话.
ncol(predictdata) = length(nir.mvr$Xmeans)

#package example
library(pls)
data(yarn)

nir.mvr <- mvr(density ~ NIR, ncomp = 5, data = yarn[yarn$train,])
predict(nir.mvr, comps = 1:4, newdata = yarn[!yarn$train,])


density

110 51.04992
22  50.72019
31  32.01454
41  34.29076
51  30.35994
61  20.57832
71  19.07786

#自行输入数据,利用function predict
predictdata=matrix(scan(file='predictdata.txt'),7)
predict(nir.mvr, comps = 1:4, newdata = predictdata)

density

[1,] 51.04992
[2,] 50.72019
[3,] 32.01454
[4,] 34.29076
[5,] 30.35994
[6,] 20.57832
[7,] 19.07786

#自行输入数据,自行运算.
nobs=dim(predictdata)[1]

B <- rowSums(coef(nir.mvr, comps = 1:4), dims = 2)
B0 <- nir.mvr$Ymeans - nir.mvr$Xmeans %*% B
pred <- predictdata %*% B + rep(B0, each = nobs)
pred

density

[1,] 51.04992
[2,] 50.72019
[3,] 32.01454
[4,] 34.29076
[5,] 30.35994
[6,] 20.57832
[7,] 19.07786

predictdata.txt (13.7 KB)
已有 1 人评分学术水平 热心指数 收起 理由
耕耘使者 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
zhangxl121 发表于 2010-3-17 12:19:48
首先谢谢大师帮忙,不过有一点我还是不理解。在偏最小二乘做回归时,是数据Y对提取成分T的回归。用来做预测的数据是X,是不能直接根据线性回归系数估计式代入就能得到预测值的呀。
所以#自行输入数据,自行运算.
nobs=dim(predictdata)[1]

B <- rowSums(coef(nir.mvr, comps = 1:4), dims = 2)
B0 <- nir.mvr$Ymeans - nir.mvr$Xmeans %*% B
pred <- predictdata %*% B + rep(B0, each = nobs)
pred

density
[1,] 51.04992
[2,] 50.72019
[3,] 32.01454
[4,] 34.29076
[5,] 30.35994
[6,] 20.57832
[7,] 19.07786
这部分好像不能直接用啊。
问题就转化为,R软件中有没有关于pls回归式直接转化为Y关于原数据X的回归的呢?
还有就是,comps = 1:4,这个是什么意思?

板凳
epoh 发表于 2010-3-17 20:36:11
你有疑问的地方,我取自:
R package "pls" source code
predict.mvr.R  
line 42 - line45

42  ## Predict with a model containing the components `comps'
43  B <- rowSums(coef(object, comps = comps), dims = 2)
44  B0 <- object$Ymeans - object$Xmeans %*% B
45  pred <- newX %*% B + rep(B0, each = nobs)

comps = 1:4,是什么意思?
## Predicted responses for a single model with components 1, 2, 3, 4
comps = 1:4

## Predicted responses for models with 1, 2, 3 and 4 components
ncomp = 1:4

另补充:
建议你可参考matlab function plsregress.m
plsregress.m source code也许比较容易理解.
%matlab'example
load spectra
X = NIR;
y = octane;
[XL,yl,XS,YS,beta,PCTVAR] = plsregress(X,y,10);
yfit = [ones(size(X,1),1) X]*beta;
residuals = y-yfit;

%%%%
data(yarn)
在matalb执行的结果是:
Y1 = [ones(7,1) X1]*beta

Y1

51.0499

50.7202

32.0145

34.2908

30.3599

20.5783

19.0779



ps:
建议你看一下我发的这本书,有助观念分清.
Introduction to Multivariate Statistical Analysis in Chemometrics
4.7 Partial Least-Squares Regression

4.7.2 MATHEMATICAL ASPECTS


page 165/326 FIGURE 4.24

已有 1 人评分学术水平 热心指数 收起 理由
耕耘使者 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

报纸
chenjiajia9 发表于 2013-6-10 19:22:49
怎么得到方程呢

地板
jiajiaqiqigugu 发表于 2016-12-30 18:13:01
zhangxl121 发表于 2010-3-17 12:19
首先谢谢大师帮忙,不过有一点我还是不理解。在偏最小二乘做回归时,是数据Y对提取成分T的回归。用来做预测 ...
请问下,关于Warning message:
'newdata' had 6 rows but variables found have 12 rows
类似问题解决了吗?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 07:47