Memilih komponen PCA yang memisahkan kelompok

13

Saya sering digunakan untuk mendiagnosis data multivariat menggunakan PCA (data omics dengan ratusan ribu variabel dan puluhan atau ratusan sampel). Data sering berasal dari eksperimen dengan beberapa variabel bebas kategorikal yang mendefinisikan beberapa kelompok, dan saya sering harus melalui beberapa komponen sebelum saya dapat menemukan komponen yang menunjukkan pemisahan antara kelompok yang diminati. Saya menemukan cara yang agak primitif untuk menemukan komponen-komponen yang diskriminatif, dan saya bertanya-tanya

  1. sejauh mana hal ini masuk akal / dapat dibenarkan, dan
  2. apakah ada cara yang lebih baik untuk mencapai hal yang sama.

Perhatikan bahwa ini adalah eksplorasi. Sebelum saya meyakinkan orang lain, saya ingin meyakinkan diri saya sendiri. Jika saya melihat bahwa ada komponen yang secara jelas membedakan kelompok yang diminati (misalnya kontrol vs perawatan), bahkan jika mereka bertanggung jawab atas sebagian kecil dari varian tanggapan, saya percaya itu lebih dari hasil dari, katakanlah, mesin yang diawasi belajar.

Ini pendekatan saya. Saya akan menggunakan kumpulan data contoh "metabo" dari pca3d dalam R.

Idenya adalah untuk menilai berapa banyak varian dari masing-masing komponen yang dapat dijelaskan oleh variabel independen. Untuk ini, saya menghitung model sederhana untuk setiap komponen dan menggunakan R2 sebagai metrik untuk memesan komponen dari "paling menarik" ke "paling tidak menarik".

require( pca3d )
# data on metabolic profiles of TB patients and controls
data( metabo )
# first column is the independent variable
pca <- prcomp( metabo[,-1], scale.= T ) 

# create a model for each component
lm.m <- lm( pca$x ~ metabo[,1] )
lm.s <- summary( lm.m )
lm.r2 <- sapply( lm.s, function( x ) x$r.squared )
plot( lm.r2, type= "l" )
text( 1:length( lm.r2 ), lm.r2, 1:length( lm.r2 ), pos= 3 )

Inilah hasilnya. Plot menunjukkan persentase perbedaan setiap komponen yang dijelaskan oleh variabel independen di metabo[,1].

masukkan deskripsi gambar di sini

Kita dapat mengurutkan komponen dengan untuk mencari tahu mana yang akan ditampilkan ; tiga komponen pertama adalah 2, 1 dan 7.r2order( lm.r2, decreasing= TRUE )

pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )

Ini plotnya:

masukkan deskripsi gambar di sini

(Kategori merah dan hijau adalah dua kelompok subjek yang bukan pasien, dan diharapkan mereka tidak dapat dibedakan.)

Untuk merumuskan kembali pertanyaan saya,

  1. Apakah pendekatan ini masuk akal bagi Anda? Masalah saya adalah tampilannya terlalu banyak seperti pengerukan data. Juga, secara intuitif saya pikir mungkin saya harus membalikkan meja dan bertanya bagian mana dari varians dalam variabel independen yang dijelaskan oleh masing-masing variabel? Akhirnya, saya (hampir) yakin bahwa saya menemukan kembali roda, buruk, jadi pertanyaan kedua saya
  2. Apa ada yang lebih bagus?

Perhatikan bahwa saya tidak ingin beralih ke kuadrat terkecil parsial atau yang serupa pada tahap ini; Saya hanya ingin mendiagnosis PCA dalam konteks klasifikasi saya.

Januari
sumber
2
Saya hanya ingin membuat dua komentar tentang pertanyaan menarik Anda. 1) Jelaskan dengan kata - kata pendekatan Anda selain menunjukkan kodenya (ingat bahwa orang di sini menggunakan berbagai perangkat lunak, tidak harus R). 2) scatterplot tidak terlalu meyakinkan tanpa paku ke lantai. Selain itu, jika Anda memiliki keraguan khusus tentang pendekatan Anda, harap bicaralah dengan mereka untuk membuat pertanyaan lebih fokus.
ttnphns
1
diedit: Untuk memperjelas, Anda pertama kali melakukan PCA dan kemudian mencoba untuk mengisolasi komponen utama yang paling baik dijelaskan oleh beberapa variabel tertentu? Apakah Anda melakukan validasi silang dengan plot scree? Mungkin saja beberapa x yang Anda pilih dari kumpulan data Anda terjadi untuk menjelaskan banyak varians dalam komponen utama, tapi saya tidak yakin itu berarti apa-apa jika variansnya sangat rendah di sepanjang komponen utama itu.
shadowtalker
1
@ssdecontrol Yah, saya melakukan pengacakan orang miskin untuk melihat apakah dihitung jauh di atas kebisingan latar belakang. Adapun apakah itu berarti apa-apa - intinya adalah bahwa biasanya itu sebenarnya, sebenarnya. Karena saya tetap melakukan semua set analisis klasik dan / atau pembelajaran mesin yang diawasi, setiap kali saya melihat bahwa PCX dijelaskan dalam bagian signifikan oleh classifier, saya akan (i) menemukan beberapa variabel yang berbeda antara kelompok-kelompok classifier ini dan ( ii) bahwa saya bisa berhasil melatih SML. R2
Januari
2
to find out what share of the overall variance in the data matrix is explained by a given classificationJika ingin tahu ini saja, Anda tidak perlu PCA. Hitung saja proporsi jumlah-kuadrat antar-grup dengan jumlah total kuadrat-kuadrat: di (SStotal-SSwithin)/SStotalmana SSwithin adalah jumlah kuadrat-kuadrat yang dikumpulkan dalam grup.
ttnphns
1
Saya tidak melihat masalah dengan cara Anda mengeksploitasi PCA, tapi saya tidak mengerti mengapa Anda benar-benar membutuhkannya. (Hanya karena kamu mungkin menyukainya?) Karena aku tidak bisa melihat tujuanmu yang sebenarnya, aku tidak bisa mengatakan apa pun untuk tujuanmu Is there anything better?.
ttnphns

Jawaban:

8

Jawaban untuk pertanyaan Anda # 1 adalah ya, solusi Anda sama dengan pengerukan data. Jawaban untuk pertanyaan Anda # 2 adalah ya, ada metode unggul dalam literatur.

Masalah utama dengan pendekatan Anda adalah bahwa Anda tidak menangani masalah data dimensi tinggi, yaitu masalah yang muncul ketika . Solusi Anda cukup sewenang-wenang dan tidak memiliki pembenaran teoretis apa pun: Saya akan mengarahkan Anda ke beberapa literatur yang dapat membantu Anda menemukan metode yang memadai di bawah ini.n<<hal

Anda menjalankan analisis yang menyerupai regresi komponen utama, kecuali bahwa Anda telah menukar variabel independen dan dependen Anda, sehingga menghasilkan analisis regresi multivarian yang besar (yang bertentangan dengan banyak ). Regresi multivarian mengharuskan ukuran sampel Anda lebih besar dari jumlah variabel dependen, persyaratan yang Anda langgar secara menyeluruh dalam contoh Anda.

Jika Anda benar-benar berkomitmen untuk menjalankan PCA pada data Anda dan kemudian menggunakan regresi multivarian, Anda harus menggunakan metode yang sesuai. Misalnya, lihatlah MRCE dan metode terkait [1].

Namun, terlepas dari beberapa komentar membingungkan yang telah Anda buat, semua yang ada dalam analisis Anda seperti yang disajikan saat ini menunjukkan bahwa tujuan utama Anda adalah untuk mengidentifikasi hubungan antara sejumlah besar variabel kontinu (metabo [, - 1]) dan variabel kategorikal tunggal (metabo [ , 1]). PCA adalah cara yang buruk untuk mencapai ini. Ada dua kelas umum solusi untuk masalah ini dalam kasus dimensi tinggi: pertama, solusi yang mengasumsikan sparsity, dan solusi yang mengasumsikan struktur faktor.

Solusi berbasis sparsity biasanya mengasumsikan bahwa hanya sebagian kecil variabel yang sebenarnya terkait dengan variabel kategori yang diminati, dan upaya untuk menemukan subset kecil ini; misalnya lihat DALASS [2]. Metode berbasis faktor-struktur mengasumsikan bahwa variabel diskriminator Anda adalah manifestasi dari variabel laten yang mendasari dengan hubungan yang benar dengan variabel kategorikal. Contoh dari kelas metode ini adalah DLDA [3].

Perhatikan bahwa saya tidak merekomendasikan metode apa pun yang saya sebutkan untuk data Anda; Anda harus hati-hati mempertimbangkan tujuan dan pengetahuan apriori masalah dalam memilih metode yang tepat.

[1] Rothman, Levina, Zhu (2010). Regresi Multivariat Jarang dengan Estimasi Kovarian. Jurnal Statistik Komputasi dan Grafis, Volume 19, Nomor 4, Halaman 947-962.

[2] Nickolay T. Trendafilov, Ian T. Jolliffe, DALASS: Seleksi variabel dalam analisis diskriminan melalui LASSO, Statistik Komputasi & Analisis Data, Volume 51, Edisi 8, 1 Mei 2007, Halaman 3718-3736.

[3] Yu, Yang (2001). Algoritma LDA langsung untuk data dimensi tinggi dengan aplikasi untuk menghadapi pengenalan. Pengakuan Pola 34, 2067-2070.

ahfoss
sumber
2
Saya telah memulai hadiah baru untuk memberikan jawaban ini.
Januari
1
@January: Ini adalah jawaban yang bagus, tapi saya ingin menunjukkan bahwa "LDA langsung" adalah algoritma yang sangat aneh di terbaik , melihat Gao dan Davis, 2005, Mengapa LDA langsung tidak sama dengan LDA : "kami menunjukkan bahwa. .. D-LDA dapat memaksakan batasan kinerja yang signifikan dalam aplikasi umum ", jadi berhati-hatilah dengannya.
Amuba mengatakan Reinstate Monica
@amoeba Terima kasih untuk kutipan itu. Saya memiliki kekhawatiran tentang DLDA untuk sementara waktu, karena tidak ada pembenaran untuk memilih komponen dengan cara tertentu. Saya melihatnya sebagai solusi yang sangat spesifik untuk masalah yang tidak perlu digeneralisasi di luar masalah diskriminasi, meskipun dapat dengan mudah disesuaikan dengan masalah apa pun dengan beberapa pengetahuan tentang komponen mana yang paling berguna untuk diskriminasi. Setiap solusi yang menerapkan diskriminasi dimensi tinggi dengan struktur faktor yang diasumsikan mengalami masalah ... apakah Anda menemukan pendekatan yang lebih baik? Saya tertarik dengan pendapat Anda di sini.
ahfoss
nk
4

@ ahfoss sudah menunjuk Anda ke LDA sebagai analogi klasifikasi ke PCA. Sebenarnya, kedua metode ini saling terkait dan juga dengan PLS:

nature of dependent variable (for supervised)     unsupervised    supervised
or structure of data (unsupervised)
continuous                                        PCA             PLS
factor/groups/classes                                             LDA

II

nhal

PLS dapat dilihat sebagai regularisasi seperti LASSO, dan juga jarang PLS tersedia (meskipun saya belum menggunakannya: data saya lebih cocok untuk PLS normal, yang tidak menganggap sparsity). Untuk diskusi yang bagus tentang berbagai metode regularisasi, lihat misalnya Elemen Pembelajaran Statistik .

np

T=X×W
L=X×B


L(n×k1)=T(n×m)B(m×k1)
L(n×k1)=X(n×p)W(p×m)B(m×k1)
L(n×k1)=X(n×p)B(p×k1)
LBBB

Catatan praktis: jika Anda bekerja di R, saya memiliki paket dalam pengembangan yang menyediakan model PLS-LDA dan PCA-LDA. Beri tahu saya jika Anda ingin mencobanya.


Untuk menghindari pengerukan data, Anda perlu memvalidasi model akhir Anda (= mengukur kinerjanya) dengan data independen.

Independen di sini berarti bahwa kasus ini (pasien?) Tidak berkontribusi pada pemasangan model dengan cara apa pun . Khususnya,

  • tidak memasukkan segala jenis preprocessing yang melibatkan banyak kasus, seperti pemusatan atau standardisasi
  • tidak memasukkan perhitungan PCA / PLS / ....
  • tidak digunakan untuk estimasi hiperparameter.

Karena Anda hanya memiliki beberapa kasus, strategi resampling akan tepat. Dalam situasi ini, mungkin lebih baik untuk memperbaiki hiperparameter (seperti jumlah PC atau variabel laten PLS, atau ikatan LASSO) dengan pengetahuan eksternal untuk menghindari pemisahan data latihan Anda yang kedua secara internal untuk optimalisasi hyperparameter.

Cbeleites mendukung Monica
sumber
+1 untuk model validasi silang. Sangat penting. Namun, saya ingin mendengar dari OP @January, yang menyatakan dia tidak tertarik pada diskriminasi, meskipun masalahnya tampaknya sangat cocok untuk analisis diskriminasi / klasifikasi.
ahfoss
Saya tidak setuju dengan pernyataan Anda bahwa k-means / PCA / etc milik keluarga yang sama. Ini menyiratkan bahwa mereka adalah kasus khusus dari model atau algoritma yang sama, yang tidak benar. Algoritma PCA adalah perhitungan matriks sederhana, sedangkan k-means adalah algoritma berulang yang telah dibandingkan dengan algoritma EM (tidak secara teknis benar karena tidak ada fungsi kemungkinan, tetapi masih merupakan perbandingan yang berguna dalam beberapa hal IMHO).
ahfoss
1
Apakah Anda mengacu pada fungsi plsgenomics :: pls.lda? Jika tidak, bagaimana paket Anda berbeda / ditingkatkan? Saya juga akan menunjukkan kepada pembaca yang tertarik bahwa PLS-LDA secara umum lebih unggul daripada teknik yang biasa digunakan hanya menjalankan PLS dengan variabel hasil dummy-kode. Meskipun pendekatan yang terakhir ini tidak selalu salah, itu pasti kludgey, paling tidak karena Anda dapat memperoleh probabilitas yang diprediksi kurang dari nol atau lebih besar dari satu!
ahfoss
@ ahfoss: Saya tidak bermaksud algoritma, karena model dasar yang sama dapat dihitung dengan algoritma yang berbeda. Misalnya untuk PCA Anda dapat menggunakan algoritma iteratif (NIPALS, POWER) atau non-iteratif (EVD, SVD). Mungkin istilah yang lebih baik daripada k-means akan menjadi "analisis klaster yang meminimalkan jumlah klaster dalam-klaster, yang misalkan k-means adalah perkiraan heuristik". Saya tidak punya waktu sekarang, akan memeriksa jawabannya nanti atau kita bisa bertemu di ruang obrolan dan menemukan deskripsi yang lebih baik.
Cbeleites mendukung Monica
1
... Perbedaan teknis adalah yang saya gunakan pls::plsruntuk pls (yang memungkinkan untuk memilih dari berbagai algoritma). Dan saya memiliki banyak fungsi post-processing misalnya untuk membalik dan memutar model, yang kadang-kadang berguna untuk interpretasi.
Cbeleites mendukung Monica