[R-br] Como recriar um componente de PCA obtido com svyprcomp()

Cesar Rabak cesar.rabak em gmail.com
Terça Abril 26 18:18:08 BRT 2016


Leonardo,

Você já está no terceiro post sobre o seu problema sem que ninguém tenha
feito uma intervenção, é o que a gente chama de « depuração confessional »
(veja
https://books.google.com.br/books?id=4miO-X83hmUC&pg=PA255&lpg=PA255&dq=C+programming+confessional+debugging&source=bl&ots=ECCCrPnkdL&sig=8EjauFqGZhBBnIcBL3w6TCz9m2o&hl=en&sa=X&ved=0ahUKEwiBqqTam63MAhWDfpAKHYCsC7kQ6AEIHTAA#v=onepage&q=C%20programming%20confessional%20debugging&f=false
)!!

Sendo específico com relação ao que você reporta, acho que você deve tentar
entender se o problema é com os dados ou com os métodos:

Escolha um dos conjuntos de dados, ou o "USArrest" ou o "api" e aplique as
duas formas de fazer a ACP, analise os resultados.

Por último, e imagino que não seja importante para você desvendar o
mistério que lhe apareceu, coloco a seguinte dúvida, qual a vantagem de
fazer toda essa ginástica se para gerar o tal resultado que não
necessitaria do comando para " análise de componentes principais
propriamente dito" você usa coeficientes, loadings, etc. obtidos desse
comando?

HTH

2016-04-24 17:13 GMT-03:00 Leonardo Ferreira Fontenelle <
leonardof em leonardof.med.br>:

> Parece que não sou a única pessoa com dificuldade em gerar esse vetor
> (quase) perfeitamente correlacionado com o primeiro vetor. O próprio
> comando predict não consegue!
>
> Retomando os exemplos anteriores:
>
> pca1 <- prcomp(USArrests, scale = TRUE)
> predpca1 <- predict(pca1, USArrests)
> cor(pca1$x[, "PC1"], predpca1[, "PC1"])
> # resultado: 1,00
>
> library("survey")
> data(api)
> dclus2 <- svydesign(id = ~ dnum + snum, fpc = ~ fpc1 + fpc2, data =
> apiclus2)
> pca2 <- svyprcomp(~ api99 + api00 + ell, design = dclus2, scale = TRUE,
> scores = TRUE)
> predpca2 <- predict(pca2, dclus2$variables)
> cor(pca2$x[, "PC1"], predpca2[, "PC1"])
> # resultado: 0,506
>
> Isso é um erro do svyprcomp??
>
> Leonardo Ferreira Fontenelle <http://lattes.cnpq.br/9234772336296638>
>
>
> Em Dom 24 abr. 2016, às 16:11, Leonardo Ferreira Fontenelle escreveu:
>
> Em Dom 24 abr. 2016, às 00:16, Leonardo Ferreira Fontenelle escreveu:
>
> Boa tarde a todos!
>
> Estou tentando escrever os resultados de uma análise de componentes
> principais de forma que os leitores possam calcular o primeiro componente a
> partir dos dados sem a necessidade de utilizar um comando de análise de
> componentes principais propriamente dito. Minha ideia é informar a
> codificação das variáveis, as cargas, os desvios-padrão, e então orientar
> os leitores a multiplicar os valores das variáveis pelas cargas e dividir
> pelos desvios-padrão e então somar tudo. Minha expectativa é de que o
> resultado seja altamente correlacionado àquele obtido por uma análise de
> componentes principais propriamente dita. No entanto, como explico a
> seguir, não estou conseguindo, e de alguma forma isso tem a ver com eu
> estar usando svyprcomp() em vez de prcomp().
>
> Para começar, mostro uma situação em que isso funciona:
>
> pca1 <- prcomp(USArrests, scale = TRUE)
> table1 <- data.frame(loadings = pca1$rotation[, "PC1"], scale =
> pca1$scale, coef = NA_real_, row.names = row.names(pca1$rotation))
> table1$coef <- table1$loadings / table1$scale
> firstcomponent1 <- with(USArrests, Murder * table1["Murder", "coef"] +
> Assault * table1["Assault", "coef"] + UrbanPop * table1["UrbanPop", "coef"]
> + Rape * table1["Rape", "coef"])
> cor(firstcomponent1, pca1$x[, "PC1"])
> # resultado: 1,00
>
> Agora, uma situação onde isso não funciona:
>
> library("survey")
> data(api)
> dclus2 <- svydesign(id = ~ dnum + snum, fpc = ~ fpc1 + fpc2, data =
> apiclus2)
> pca2 <- svyprcomp(~ api99 + api00 + ell, design = dclus2, scale = TRUE,
> scores = TRUE)
> table2 <- data.frame(loadings = pca2$rotation[, "PC1"], scale =
> pca2$scale, coef = NA_real_, row.names = row.names(pca2$rotation))
> table2$coef <- table2$loadings / table2$scale
> firstcomponent2 <- with(apiclus2, api99 * table2["api99", "coef"] + api00
> * table2["api00", "coef"] + ell * table2["ell", "coef"])
> cor(firstcomponent2, pca2$x[, "PC1"])
> # resultado: 0,506
>
> Como eu consigo cargas ("loadings") e desvios-padrão ("scale") que eu
> possa usar de forma a conseguir calcular à mão algum vetor altamente
> correlacionado com o primeiro componente do svyprcomp()?
>
> Grato!
>
> Leonardo Ferreira Fontenelle <http://lattes.cnpq.br/9234772336296638>
>
>
>
> O problema tem a ver com a ponderação das observações. Não apenas essa
> parece ser a única diferença entre prcomp() e svyprcomp() (a função não
> leva em consideração correlações dentro dos conglomerados) mas também usar
> svyprcom() num delineamento gera componentes com uma correlação quase
> perfeita com os índices criados à mão como no e-mail anterior.
>
> Digitar "svyprcomp" na linha de comando do R, sem aspas ou parênteses,
> mostra o código-fonte. Ele me parece usar uma abordagem equivalente à da
> resposta http://stats.stackexchange.com/a/113488. Mesmo assim, não
> consigo entender de que forma posso criar um índice à mão que seja (quase)
> perfeitamente correlacionado com o primeiro componente.
>
> Leonardo Ferreira Fontenelle <http://lattes.cnpq.br/9234772336296638>
>
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160426/0a8338aa/attachment.html>


Mais detalhes sobre a lista de discussão R-br