【问题标题】:PLSR in R with "pls" package带有“pls”包的 R 中的 PLSR
【发布时间】:2017-01-12 17:40:29
【问题描述】:

我正在尝试拟合 PLSR 模型,但我做错了。下面,您可以看到我是如何创建数据框及其结构的。

reflektance <- read_excel("data/reflektance.xlsx", na = "NA")
reflektance <- dput(reflektance)
pH <- read_excel("data/rijen2016.xls", na = "NA")
pH <- na.omit(pH)
pH <- dput(pH)

reflektance<-aggregate(reflektance[, 2:753], list(reflektance$Vzorek), mean)
colnames(reflektance)[colnames(reflektance)=='Group.1']<-'Vzorek'
datapH <- merge(pH, reflektance, by="Vzorek")
datasetpH <- data.frame(pH=datapH[,2], ref=I(as.matrix(datapH[, 3:754], 22, 752)))

问题在于使用“plsr”,因为结果是这个错误:

ph1<-plsr(pH ~ ref, ncomp = 5, data=datasetpH)
Error in pls::mvr(ref ~ pH, ncomp = 5, data = datasetpH, method = "kernelpls") : 
Invalid number of components, ncomp

输入(反射率): https://jpst.it/RyyS

这里你可以看到表格datapH的结构:

'data.frame':   22 obs. of  754 variables:
 $ Vzorek: chr  "5 - P01" "5 - P02" "5 - P03" "5 - R1 - A1" ...
 $ pH/H2O: num  6.96 6.62 7.02 5.62 5.97 6.12 5.64 5.81 5.61 5.47 ...
 $ 325   : num  0.017 0.0266 0.0191 0.0241 0.016 ...
 $ 326   : num  0.021 0.0263 0.0154 0.0264 0.0179 ...
 $ 327   : num  0.0223 0.0238 0.0147 0.028 0.0198 ...
 ...

这里是表datasetpH的结构:

'data.frame':   22 obs. of  2 variables:
 $ pH : num  6.96 6.62 7.02 5.62 5.97 6.12 5.64 5.81 5.61 5.47 ...
 $ ref: AsIs [1:22, 1:752] 0.016983.... 0.026556.... 0.019059.... 0.024097.... 0.016000.... ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "325" "326" "327" "328" ...

您有什么建议和解决方案吗?谢谢

【问题讨论】:

  • 在错误消息中你有 ref~p​​H,不应该反过来吗?在我看来,它似乎将 pH 值作为预测变量,因此 ncomp 存在问题,因为 pH 值只是一个变量。
  • 对不起,到处都是“ref”。这是我写这篇文章时的错误。我已经尝试将其更改为 pH~ref,但仍然是同样的错误。
  • 我创建了一个模仿你的假数据集:datasetpH &lt;- data.frame(pH=rnorm(30,5,1),ref=I(matrix(data=rnorm(300),nrow = 30, ncol = 10)))。我没有收到任何错误:pls::plsr(pH ~ ref, ncomp = 5, data=datasetpH)
  • 它也适用于你的假数据,但我不明白为什么我的数据有问题。有什么想法吗?
  • pH 只是一个列,尝试使用 ph=datapH[,2] 而不是 I()

标签: r dataframe regression


【解决方案1】:

问题似乎来自您的一个仅包含 NA 的列。
names(df)gives 输出的最后一行:

[745] "1068"   "1069"   "1070"   "1071"   "1072"   "1073"   "1074"   "1075"   NA  

使用您的数据 + 一些随机生成的 pH 值(不在 reflektance 数据框中,此处命名为 df):

test=data.frame(pH=rnorm(23,5,2), ref=I(as.matrix(df[, 2:752], 22, 751)))
pls::plsr(pH ~ ref, data=test)

矩阵中的错误(0,ncol = ncomp,nrow = npred): 无效的 'ncol' 值 (

请注意,索引与您的索引有些不同。我没有 df 中的第二列(您的中包含 pH 值的那一列)。
如果我删除包含 NA 的最后一列:

test=data.frame(pH=rnorm(23,5,2), ref=I(as.matrix(df[, 2:752], 22, 751)))
pls::plsr(pH ~ ref, data=test)
Partial least squares regression , fitted with the kernel algorithm.
Call:
plsr(formula = pH ~ ref, data = test)

如果解决了问题,请告诉我。

【讨论】:

  • 是的,非常感谢。问题实际上是 NA 的最后一列。现在可以了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2021-08-11
  • 2019-05-25
相关资源
最近更新 更多