0

caret相关的软件包和帮助系统中varImp()有:

偏最小二乘法:这里的变量重要性度量基于绝对回归系数的加权和。权重是 PLS 组件数量的平方和减少的函数,并针对每个结果单独计算。因此,系数的贡献与平方和的减少成比例地加权。

caret以下是按包分类模型的可变重要性的输出method="pls"

> varImp(plsFitvac)
   pls variable importance

  variables are sorted by average importance across the classes
             H       P      R     Q
IL17A    9.516 100.000 19.813 61.20
IL8     17.814   1.344 80.628 34.33
IL6ST   10.319  75.452 62.296 68.41
IL23A    7.662  55.422 43.188 44.17
IL27RA  10.311   0.000 45.932 24.76
IL12RB2 15.497  28.467 38.848 33.73
IL12B   13.569  22.799 32.728 27.25
IL12RB1 12.292  23.431  6.395 18.67
IL12A   10.394  22.774 12.330 18.94
EBI3    12.039   6.932 14.877 11.01
IL23R   13.053  10.018  9.708 13.22  

很好,但是当我通过这行代码提取这个数据框时:

df <- varImp(plsFitvac)$importance  

我得到与上面相同但未排序的结果,但如果已排序会非常好。无论如何,要根据类的平均重要性对这个数据框进行排序(如输出中所述),我这样做了:

df$Sort <- apply(df, 1, sum)
df$Sort <- df$Sort/ncol(df) # not needed since sum and average will be sorted alike
df[order(df$Sort,decreasing=TRUE),]

> df[order(df$Sort,decreasing=TRUE),]
                H          P         R        Q      Sort
IL6ST   10.318521  75.451572 62.295779 68.40740 43.294655
IL17A    9.515726 100.000000 19.813439 61.20098 38.106029
IL23A    7.662351  55.422249 43.187811 44.16892 30.088267
IL8     17.813522   1.343589 80.628315 34.32519 26.822122
IL12RB2 15.497069  28.466890 38.847943 33.73476 23.309331
IL12B   13.569266  22.798682 32.727759 27.24567 19.268275
IL27RA  10.311489   0.000000 45.932101 24.76301 16.201321
IL12A   10.393673  22.773860 12.329890 18.94323 12.888131
IL12RB1 12.291526  23.431046  6.395495 18.66685 12.156983
IL23R   13.053380  10.018339  9.708473 13.22094  9.200227
EBI3    12.039321   6.931682 14.877214 11.00619  8.970881  

所以最终得到的版本与via函数的排序列表不同我在这里错过了什么吗?谢谢。 caretvarImp()

注意:
我没有传递importance = TRUE参数来train()调用 PLSDA 模型,即method = "pls".

$重要性

> dput(df)
structure(list(H = c(17.8135216215421, 9.51572613703257, 7.66235106434041, 
13.0533801732928, 12.0393206867905, 10.3185210244416, 10.3936725783446, 
15.4970686175322, 13.569265567599, 12.291526066084, 10.3114887728613
), P = c(1.34358921525031, 100, 55.4222485106407, 10.0183388053119, 
6.93168239216908, 75.4515720604057, 22.7738599760963, 28.4668895810321, 
22.7986823025468, 23.4310464801875, 0), R = c(80.6283150180913, 
19.8134392303359, 43.1878112878907, 9.70847280019312, 14.8772141493434, 
62.2957787591232, 12.3298895434334, 38.8479426109151, 32.7277593254102, 
6.39549491068232, 45.932101268196), Q = c(34.3251855315416, 61.2009790458015, 
44.1689231007598, 13.2209412495112, 11.0061874803613, 68.4074013762385, 
18.9432341406872, 33.7347566350668, 27.2456691770754, 18.6668467881651, 
24.7630136095146)), .Names = c("H", "P", "R", "Q"), row.names = c("IL8", 
"IL17A", "IL23A", "IL23R", "EBI3", "IL6ST", "IL12A", "IL12RB2", 
"IL12B", "IL12RB1", "IL27RA"), class = "data.frame")  

问题:

如何衡量跨类的重要性?我可以信任未排序varImp()的输出吗?

编辑:对变量重要性进行排序
的方法:max()

vi <- varImp(plsFitvac)$importance  
vi$max <- apply(vi, 1, max)
vi[order(-vi$max),]  

结果相同varImp()

varImp(plsFitvac)  

这产生了:

> vi[order(-vi$max),]
                H          P         R        Q       max
IL17A    9.515726 100.000000 19.813439 61.20098 100.00000
IL8     17.813522   1.343589 80.628315 34.32519  80.62832
IL6ST   10.318521  75.451572 62.295779 68.40740  75.45157
IL23A    7.662351  55.422249 43.187811 44.16892  55.42225
IL27RA  10.311489   0.000000 45.932101 24.76301  45.93210
IL12RB2 15.497069  28.466890 38.847943 33.73476  38.84794
IL12B   13.569266  22.798682 32.727759 27.24567  32.72776
IL12RB1 12.291526  23.431046  6.395495 18.66685  23.43105
IL12A   10.393673  22.773860 12.329890 18.94323  22.77386
EBI3    12.039321   6.931682 14.877214 11.00619  14.87721
IL23R   13.053380  10.018339  9.708473 13.22094  13.22094  

但是sum()跨类使用重要性产生了不同的排名(见上文)。那么哪一个是正确的,如果max()方法中存在关联会发生什么?

4

2 回答 2

2

使用显示的输出varImp(plsFitvac)格式化并显示为某种缩写的精度级别:

> format(9.515726, digits = 4)
[1] "9.516"

digits尝试在此代码中使用各种值:

format(varImp(plsFit)$importance, digits = 4)

你应该能够看到它们是相同的值。

打印数据框时,print.data.frame使用digits = getOption("digits")whileprint.varImp.train使用max(3, getOption("digits") - 3).

的默认值getOption("digits")让我很头疼,这就是我的功能是这样的。

编辑:如果问题是关于排序的,那么函数对这些排序的方式是找到每个预测变量在类中的最大重要性并以此为基础对它们进行排序。它还有更多内容(如果有关系等),代码在未记录的内部函数sortImp中。此代码应近似该函数:

vi$max <- apply(vi, 1, max)
vi[order(-vi$max),]

最大限度

于 2014-01-22T17:06:59.080 回答
0

尝试使用 write.csv2(varImp(vi),"vi.csv") ,您可以在 excel 中进行排序。

于 2017-04-12T04:00:43.923 回答