Ошибка при выборе функции с рекурсивным устранением признаков в модели случайного леса

У меня есть несколько сотен образцов, и я уже разделил их на четыре разных класса (кластера). Теперь меня интересует определение лучшего набора генов, которые классифицируют образцы по разным классам.

Я хочу применить randomforest с рекурсивным устранением признаков и обнаружить гены (особенности). Мои данные выглядят так, как показано ниже. Просто разместите здесь несколько примеров данных.

введите описание изображения здесь

Приведенные выше данные - это просто пример: Мои исходные данные находятся во фрейме данных df со 100 выборками в первом столбце и 4 классами во втором столбце и столбцами с 3 по столбец 1002, всего 1000 генов со значениями выражений.

Я использую приведенный ниже код, но вижу ошибку.

library(caret)
library(mlbench)
library(Hmisc)
library(randomForest)

# define the control using a random forest selection function
control <- rfeControl(functions=rfFuncs, method="cv", number=10)

# run the RFE algorithm
results <- rfe(df[,3:1002], df[,2], sizes = df[,1:1002], rfeControl=control)

Возникла ошибка: и я чувствую, что где-то делаю что-то не так.

Error in summary.connection(connection) : invalid connection

Здесь я привожу dput приведенных выше данных.

df <-structure(list(Samples = structure(c(1L, 8L, 9L, 10L, 11L, 12L, 
13L, 14L, 15L, 2L, 3L, 4L, 5L, 6L, 7L), .Label = c("Sample1", 
"Sample10", "Sample11", "Sample12", "Sample13", "Sample14", "Sample15", 
"Sample2", "Sample3", "Sample4", "Sample5", "Sample6", "Sample7", 
"Sample8", "Sample9"), class = "factor"), Class = structure(c(1L, 
2L, 3L, 1L, 2L, 4L, 2L, 1L, 1L, 4L, 1L, 3L, 4L, 1L, 1L), .Label = c("Class1", 
"Class2", "Class3", "Class4"), class = "factor"), Gene1 = c(1.030078784, 
0.944152632, 0.140700452, 0.013432323, 0.265233165, -0.084496727, 
4.835469554, 0.089434913, -0.433436179, 1.462895475, -0.116005356, 
1.007868422, 0.244881864, -1.495666899, 0.364368654), Gene2 = c(1.407236415, 
1.229003431, -0.322221459, -1.361955252, 0.310963955, 0.80115063, 
4.27765356, 0.872413223, -0.568249851, 1.187873069, -0.255284575, 
1.878058722, -0.767371822, -0.859697473, 0.057304769), Gene3 = c(0.200772234, 
-0.048349737, 1.224274924, 0.492396142, 0.500786902, -0.731802706, 
1.853246564, 1.611995455, 0.287088678, 0.509235514, 2.031735375, 
3.074950771, 2.069407179, 0.886158642, 1.736798303), Gene4 = c(1.23309207, 
1.321282889, 2.403301108, 0.748860637, 1.019200751, 1.393254607, 
2.667976275, 1.158136576, 1.89503732, 2.178257717, 0.747697632, 
2.834410716, 0.028594536, -0.411039831, 1.100167946), Gene5 = c(0.883005616, 
0.570786704, 0.72649548, 4.705893892, 0.086345885, 0.502530136, 
2.681497202, 0.640362079, 0.327319762, 2.086767741, 1.853085301, 
1.001799748, 0.126208601, 0.911621722, 0.671191951), Gene6 = c(2.590519025, 
3.076688902, 1.77414005, 1.014363629, 1.134652225, 2.71957962, 
4.696379063, -0.301828123, 1.214261665, 2.413881644, -0.470794827, 
0.520494891, 0.194511306, 0.075331863, 2.315680177), Gene7 = c(0.088929673, 
0.472549468, -0.125630236, -0.069648505, -0.715250242, 0.068554966, 
4.131662998, -0.075265565, -1.234425917, 0.343350342, 0.190414782, 
1.153495806, 0.210317581, -0.475603641, 0.294299351), Gene8 = c(2.112231178, 
2.780100532, 2.423828553, 1.569215682, 1.018119196, 2.583413401, 
6.483053565, 2.215201821, 1.893325529, 2.342058862, 4.001423142, 
4.221704757, 1.978211867, 1.452633851, 2.556589741)), class = "data.frame", row.names = c(NA, 
-15L))

Может ли кто-нибудь рассказать мне, как я могу использовать приведенные выше данные и применить случайный лес, чтобы узнать, какие гены классифицируют образцы по разным классам. спасибо


person beginner    schedule 21.02.2020    source источник


Ответы (1)


размеры относятся к количеству функций, которые вы хотели бы попробовать и сохранить, они должны быть числовыми, но вы предоставили что-то странное в df[,1:1002].

См. Что-то вроде ниже, где я имитирую набор данных и правильно устанавливаю размеры, чтобы гарантировать, что он будет работать, чтобы выбрать оптимальное количество функций (из того, что вы предоставляете):

library(caret)
library(mlbench)
library(Hmisc)
library(randomForest) 

set.seed(101)
df = data.frame(samples=paste0("Samples",1:99),
                Class=paste0("Class",rep(1:3,33)),
                matrix(rnorm(99*1000),ncol=1000))

colnames(df)[3:ncol(df)]=paste0("Gene",1:1000)

# we create like 100 informative genes for Class1 and Class2
df[df$Class=="Class1",3:103] = df[df$Class=="Class1",3:103] + rpois(33*100,1.5)
df[df$Class=="Class2",104:203] = df[df$Class=="Class2",104:203] + rpois(33*100,1.5)

control <- rfeControl(functions=rfFuncs, method="cv", number=2)

# run the RFE algorithm
results <- rfe(df[,3:1002], df[,2], sizes = c(50,100,200), 
               rfeControl=control)

Из вышесказанного я прошу 50 100 или 200 информативных функций и получаю:

results
Recursive feature selection

Outer resampling method: Cross-Validated (2 fold) 

Resampling performance over subset size:

 Variables Accuracy  Kappa AccuracySD KappaSD Selected
        50   0.9792 0.9688    0.02946 0.04419         
       100   0.9896 0.9844    0.01473 0.02210         
       200   1.0000 1.0000    0.00000 0.00000        *
      1000   1.0000 1.0000    0.00000 0.00000         

The top 5 variables (out of 200):
   Gene94, Gene198, Gene137, Gene136, Gene158

> results$optsize
[1] 200
person StupidWolf    schedule 21.02.2020
comment
Большое спасибо за ответ. извините, я немного запутался и сомневаюсь. Итак, здесь sizes - это то место, где вы запросили наиболее информативные гены. И results показывают * в selected. Что это означает? И как мне узнать, какие гены приводят к классификации образцов в разные классы? - person beginner; 21.02.2020
comment
Да, поэтому с размерами вы пробуете 50, 100 или 200 генов ... Исходя из точности по сравнению с полным набором данных, rfe говорит вам использовать 200 генов, потому что это почти так же хорошо, как использование 1000 генов. Вы получаете гены, выполняя результаты $ optVariables - person StupidWolf; 21.02.2020
comment
Вы можете видеть, что с 50 генами, у вас есть точность 0,9696, 100, 0,9898 и 200, вы получаете что-то близкое к тому, что получаете с 1000, поэтому имеет смысл использовать 200, верно? конечно, этот пример немного сфальсифицирован (потому что я так смоделировал), но с вашим фактическим набором данных вы должны увидеть этот образец с разными размерами, если есть действительно информативные функции - person StupidWolf; 21.02.2020
comment
Да, теперь я понял. снова небольшое сомнение. Итак, к какому классу из четырех классов ведут эти 200 генов? - person beginner; 21.02.2020
comment
Его можно использовать для разделения 3 классов, потому что в случайном лесу вы указали 3 класса. Если вы хотите знать гены, которые различают каждый класс, вы должны вместо этого настроить его как двоичный, например, class1 по сравнению с другими, class2 по сравнению с другими и т. Д. - person StupidWolf; 21.02.2020
comment
Скорее всего, это даст вам те же результаты, поэтому я предлагаю вам взять эти, скажем, 200 генов и просто посмотреть их значения или сильные стороны в разных классах. Это скажет вам, для каких классов это полезно - person StupidWolf; 21.02.2020
comment
В порядке. когда я попытался запустить один из моих наборов данных, я снова увидел Error. В наборе данных 1261 столбца. dim(df) равно 60 1261. первый столбец с названиями образцов. Второй столбец с 4 классами. От 3-го столбца до 1261-го столбца - его гены с данными экспрессии. Итак, я использовал эту команду. results <- rfe(df[,3:1261], df[,2], sizes = c(50,100,200), rfeControl=control) И ошибка Error in summary.connection(connection) : invalid connection - person beginner; 21.02.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person StupidWolf; 21.02.2020