R:不能对多个描述符运行偏最小二乘回归

时间:2016-04-18 03:27:33

标签: r csv regression descriptor

我生成了一个csv表“T.CSV”:

"system","response","NIR.a","NIR.b"
 1,1,2,3
 2,4,5,6
 3,7,8,9

对于一个描述符,plsr成功但多个描述符失败:

> library(pls)
> j <- read.csv(file="T.CSV",header=T,sep=",")
> head(j)
system response NIR.a NIR.b
1      1        1     2     3
2      2        4     5     6
3      3        7     8     9
> mod <- plsr(response ~ NIR.a , data = j ,  ncomp=1 )
> mod <- plsr(response ~ NIR , data = j ,  ncomp=1 )
Error in eval(expr, envir, enclos) : object 'NIR' not found

但是,如果我加载了pls包的“oliveoil”示例,则回归适用于多个描述符:

> data(oliveoil)
> head(oliveoil)
chemical.Acidity chemical.Peroxide chemical.K232 chemical.K270 chemical.DK
G1             0.73              12.7         1.9           0.139       0.003
G2             0.19              12.3         1.678         0.116      -0.004
G3             0.26              10.3         1.629         0.116      -0.005
G4             0.67              13.7         1.701         0.168      -0.002
G5             0.52              11.2         1.539         0.119      -0.001
I1             0.26              18.7         2.117         0.142       0.001
sensory.yellow sensory.green sensory.brown sensory.glossy sensory.transp
G1           21.4          73.4          10.1           79.7           75.2
G2           23.4          66.3           9.8           77.8           68.7
G3           32.7          53.5           8.7           82.3           83.2
G4           30.2          58.3          12.2           81.1           77.1
G5           51.8          32.5             8           72.4           65.3
I1           40.7          42.9          20.1           67.7           63.5
sensory.syrup
G1          50.3
G2          51.7
G3          45.4
G4          47.8
G5          46.5
I1          52.2

这里pls适用于多个描述符:

> mod <- plsr(chemical ~ sensory , data = oliveoil ,  ncomp=1 )
>

你可以在我的第一张桌子上告诉我哪里出错吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果我们看一下str(oliveoil),感官&#39;是matrix列,n列。因此,要以这种方式使用公式,&#34; NIR&#34;也应该是matrix

中的data.frame
j1 <- j[1:2]
j1["NIR"] <- as.matrix(setNames(j[3:4], letters[1:2]))
mod <- plsr(response ~ NIR , data = j1 ,  ncomp=1 )
str(mod)
#List of 19
# $ coefficients   : num [1:2, 1, 1] 0.5 0.5
# ..- attr(*, "dimnames")=List of 3
# .. ..$ : chr [1:2] "a" "b"
# .. ..$ : chr "response"
# .. ..$ : chr "1 comps"
# ----

数据

j <- structure(list(system = 1:3, response = c(1L, 4L, 7L),
 NIR.a = c(2L, 
 5L, 8L), NIR.b = c(3L, 6L, 9L)), .Names = c("system", "response", 
 "NIR.a", "NIR.b"), class = "data.frame", row.names = c(NA, -3L))

答案 1 :(得分:0)

在您的命令mod <- plsr(response ~ NIR , data = j , ncomp=1 )中,在~的RHS上,确保解释变量的名称与完全匹配数据中的列名称(就拼写,大写/小写)。在R对head的回复中,我注意到没有名为NIR的列。但有一个名为NIR.a,一个名为NIR.b。您是否检查过使用NIRNIR.a替换NIR.b是否有效?