Como fazer redução de dimensionalidade em R

28

Eu tenho uma matriz em que a (i, j) me diz quantas vezes eu visualizei a página j. Existem 27 mil indivíduos e 95 mil páginas. Eu gostaria de ter um punhado de "dimensões" ou "aspectos" no espaço das páginas que corresponderiam a conjuntos de páginas que geralmente são vistos juntos. Meu objetivo final é poder calcular com que frequência as páginas individuais foram visualizadas nas dimensões 1, 2, etc.

Li a documentação do R sobre análise de componentes principais e decomposição de valor único e executei esses comandos, mas não tenho certeza de como proceder.

Como posso usar a redução de dimensionalidade para fazer isso? Ou isso é realmente um problema de agrupamento e devo examinar os algoritmos de agrupamento?

Muito obrigado por qualquer insight ~ l

laramichaels
fonte

Respostas:

10

Vamos assumir que mat_pages [] contém páginas nas colunas (que você deseja agrupar) e indivíduos nas linhas. Você pode agrupar páginas com base em dados individuais no Rby usando o seguinte comando:

  pc <- prcomp(x=mat_pages,center=TRUE,scale=TRUE)

A matriz loadings é a matriz de vetores próprios da decomposição SVD dos dados. Eles dão o peso relativo de cada PAGE no cálculo das pontuações. Cargas com valores absolutos maiores têm mais influência na determinação da pontuação do componente principal correspondente.

No entanto, devo destacar também a curta utilização do PCA para agrupar páginas. A razão para isso é que as cargas fornecem pesos maiores às PAGES com variação mais alta, independentemente de essa variação ser realmente devida ao conteúdo da PAGE ou a algum outro motivo (pode ser variação técnica ou individual). Os carregamentos não refletem necessariamente as verdadeiras diferenças entre os grupos, que (talvez) são seu principal interesse. MAS, esse agrupamento reflete verdadeiramente as diferenças no grupo sob a suposição de que todas as páginas têm a mesma variação (não sei se essa é uma suposição válida).

Se você possui instalações de computação poderosas (o que pode ser possível, considerando o tamanho dos dados), usar modelos hierárquicos pode ser uma boa ideia. Em R, isso pode ser feito usando o pacote lme4.


O que você faz depois de ter as pontuações?

Essa é uma sugestão grosseira e a análise depende muito da aparência dos dados. Além disso, eu acho que esse processo seria altamente inviável para agrupar os dados de magnitude que você possui.

pc.col <- paste("page", 1:27000, sep=".")

pdf("principle-components.pdf")
plot(pc$x[,1:2]) ## Just look at the 1st two loadings (as you can see the groupings in a plane)
dev.off()

Felizmente, isso pode fornecer uma imagem de como os dados são agrupados.

Aviso: não é isso que eu recomendaria.


Minha recomendação:

Problemas como esses surgem frequentemente na genômica. No seu caso, as páginas correspondem a genes e os indivíduos correspondem a pacientes (basicamente indivíduos têm o mesmo significado que na genômica).

Você deseja agrupar as páginas com base nos dados.

Você pode usar muitos pacotes de cluster no R e foi apontado em outras respostas. Um problema fundamental dos pacotes é como hclust: como determinar o número de clusters. Alguns dos meus favoritos são:

  • pvclust (fornece clusters e também fornece um valor de p para cada cluster. Usando o valor de p, você pode determinar os clusters estatisticamente significativos. Problema : requer muita energia computacional e não tenho certeza se ele funcionará com os dados de seu Tamanho)
  • hopach (fornece o número estimado de clusters e os clusters)
  • Se houver outros pacotes disponíveis no Bioconductor, verifique-os na visualização de tarefas.

Você também pode usar algos de cluster como k-means etc. Tenho certeza de que vi um tópico neste fórum sobre cluster. As respostas foram muito detalhadas. Tal Galili perguntou se eu me lembro corretamente.

suncoolsu
fonte
@ suncoolsu: muito obrigado! Acabei de seguir o seu conselho e executei o prcomp. Também guardei a matriz de cargas que produziu. Mas como posso usar essa matriz para agrupar as páginas?
laramichaels 26/09/10
Olá Laramichaels, encontre a minha resposta abaixo.
suncoolsu 28/09/10
@suncoolsu: Estou lidando com um problema semelhante, mas quero "agrupar" os indivíduos que têm a mesma "dinâmica" (na verdade, tenho um grande número de séries temporais por regiões e quero modelá-las). Eu estava pensando em usar pam com a distância de correlação (1-rho). Esta é uma maneira recomendada? Você poderia sugerir alguns caminhos para explorar?
teucer 28/09/10
@Musa .. Você pode ser um pouco mais claro. Acho que não entendo a "dinâmica" mencionada por você. Definitivamente, pam está OK para agrupar. Mas você também pode tentar os pacotes R pvclust e hopach, conforme mencionado por mim. Além disso, o SOM (mapas auto-organizados) é uma maneira diferente de analisar o cluster. Por favor, veja o livro de Ripley e Venable (2002) - MASS para mais detalhes. O livro oferece um tratamento completo do agrupamento.
suncoolsu
@suncoolsu: Desculpe pela formulação pobre! Tenho 200 séries temporais que quero modelar (ou seja, simular). Eu acho que eu posso cluster "similar" (ou seja, ter o mesmo comportamento ao longo do tempo: a abordagem para a frente é usar a correlação) timeseries e simular apenas os timeseries de cluster ...
Teucer
4

É certamente um problema de agrupamento. Confira o clusterpacote Rs para obter uma visão geral das opções de algoritmos ( pame agnessão as melhores opções para começar; elas representam dois fluxos principais em cluster - centróides e hierárquicos ).
O principal problema para usar o cluster em seus dados é definir uma boa medida de similaridade entre as páginas; o mais simples é usar a distância de Manhattan; um pouco mais complexo para contar o número de espectadores comuns e normalizá-lo com, digamos, o número de espectadores da primeira e da segunda página - isso deve silenciar os efeitos da popularidade.

(número de páginas)×(número de páginas)

jan-glx
fonte
Eu votei na sua resposta. No entanto, você pode fornecer os novos links para o relatório na última frase. O antigo está morto.
Discipulus
1
Receio que esteja perdido para sempre ... Geralmente, tratava-se de implementações de métodos de clustering que não criam explicitamente a matriz de similaridade de cada um, mas investigam objetos sob demanda.
1

A redução de dimensionalidade é basicamente a aplicação do algoritmo de clustering aos atributos (colunas). Devido à dimensionalidade bastante grande do seu conjunto de dados, você pode tentar usar o SOM (mapa auto-organizado / rede Kohonen) para criar um mapa para indivíduos ou páginas. Você pode ver se os padrões são significativos (interpretáveis).


fonte
1

Se você usa o PCA, meu conselho seria examinar brevemente outros componentes além dos dois primeiros. Depois de ter o prcompobjeto pc(consulte a publicação do suncoolsu), é possível plot(pc)ver a quantidade de variação atribuída aos diferentes componentes principais. Você também pode facilmente visualizar vários (geralmente três ou quatro) deles com pairs(pc$x[,1:3])ou, usando lattice, splom(pc$x[,1:3]).

Laurent
fonte