{"id":22333,"date":"2015-07-23T16:53:14","date_gmt":"2015-07-23T16:53:14","guid":{"rendered":"http:\/\/www.inacreditavel.pt\/?p=22333"},"modified":"2016-07-09T11:01:29","modified_gmt":"2016-07-09T11:01:29","slug":"r-e-analise-fatorial","status":"publish","type":"post","link":"http:\/\/www.inacreditavel.pt\/?p=22333","title":{"rendered":"R e An\u00e1lise Fatorial"},"content":{"rendered":"<p>O <a href=\"https:\/\/www.r-project.org\/\">R<\/a> \u00e9 uma ferramenta extremamente potente para fazer c\u00e1lculos estat\u00edsticos. Para al\u00e9m das estat\u00edsticas de base, \u00e9 poss\u00edvel adicionar outras estat\u00edsticas dispon\u00edveis em pacotes opcionais. Para a an\u00e1lise fatorial, por exemplo, \u00e9 necess\u00e1rio instalar um pacote extra. Eu estou a usar o <strong>psych<\/strong> e instalei-o assim, dentro do ambiente do R:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\ninstall.packages(\"psych\")\r\n<\/pre>\n<p>Para efetuar uma an\u00e1lise fatorial de componentes principais, estou a utilizar a fun\u00e7\u00e3o <strong>principal<\/strong> que tem os seguintes par\u00e2metros:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\nprincipal(r, nfactors = 1, residuals = FALSE,rotate=\"varimax\",n.obs=NA, covar=FALSE, scores=TRUE,missing=FALSE,impute=\"median\",oblique.scores=TRUE,method=\"regression\",...)\r\n<\/pre>\n<p>O primeiro par\u00e2metro \u00e9 o \u00fanico obrigat\u00f3rio e pode ser uma matriz de dados com as vari\u00e1veis a analisar, ou ent\u00e3o a matriz de correla\u00e7\u00f5es das vari\u00e1veis. No caso de ser a matriz de dados, a fun\u00e7\u00e3o calcula a matriz de correla\u00e7\u00f5es removendo os valores em falta (missing values) aos pares (<strong>pairwise<\/strong>), ou seja, para cada correla\u00e7\u00e3o entre duas vari\u00e1veis, s\u00e3o removidos apenas os casos que contenham valores em falta nessas vari\u00e1veis.<\/p>\n<p>Ora, se formos efetuar o mesmo c\u00e1lculo no SPSS, por omiss\u00e3o \u00e9 utilizada a remo\u00e7\u00e3o <strong>listwise<\/strong> dos casos, ou seja, todos os casos que contenham valores em falta, em qualquer das vari\u00e1veis usadas, s\u00e3o removidos previamente ao c\u00e1lculo.<\/p>\n<p>Portanto, havendo valores em falta nas vari\u00e1veis, por omiss\u00e3o, o R e o SPSS produzem resultados diferentes para a mesma an\u00e1lise fatorial.<\/p>\n<p>Para se obterem resultados iguais nos dois programas, \u00e9 necess\u00e1rio que a t\u00e9cnica de remo\u00e7\u00e3o dos valores em falta seja a mesma. No caso do R, posso calcular a matriz de correla\u00e7\u00f5es previamente, usando a remo\u00e7\u00e3o <strong>listwise<\/strong> para os valores em falta, e depois forne\u00e7o essa matriz \u00e0 fun\u00e7\u00e3o <strong>principal<\/strong>.<\/p>\n<p>Fica aqui a sequ\u00eancia de instru\u00e7\u00f5es desde o carregamento dos dados at\u00e9 \u00e0 obten\u00e7\u00e3o da an\u00e1lise fatorial.<\/p>\n<p>1) Abrir o ficheiro de dados e criar a matriz (data.frame) com as vari\u00e1veis a processar<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\nX&lt;-read.table('\/tmp\/FACT.txt',header=T)\r\nattach(X)\r\ndados&lt;-data.frame(M1=M1, M2=M2, M3=M3, M4=M4, M5=M5, M6=M6, M7=M7, M8=M8, M9=M9, M10=M10, M11=M11, M12=M12, M13=M13, M14=M14, M15=M15, M16=M16, M17=M17, M18=M18, M19=M19, M20=M20, M21=M21, M22=M22)\r\nlibrary(psych)\r\n<\/pre>\n<p>O ficheiro de dados tem 22 vari\u00e1veis com os nomes indicados acima, e com um aspeto semelhante ao seguinte:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\nM1      M2      M3      M4      M5     ...     M21     M22\r\n4       5       5       4       4      ...     4       2\r\n4       5       5       2       4      ...     5       3\r\n5       5       4       5       4      ...     4       1\r\n4       5       4       2       5      ...     4       4\r\n4       5       4       4       5      ...     5       5\r\n3       5       4       4       5      ...     4       4\r\n5       5       4       3       4      ...     4       4\r\n4       4       5       5       4      ...     4       3\r\n4       2       4       3       5      ...     5       2\r\n..     ...     ...     ...     ...     ...    ...     ...\r\n4       4       2       4       4      ...     4       4\r\n<\/pre>\n<p>2) Todas as vari\u00e1veis t\u00eam o 9 para representar o valor em falta. Por isso, criei uma fun\u00e7\u00e3o para substituir o 9 pelo NA (valor em falta no R) para todas as vari\u00e1veis do <strong>data.frame<\/strong>.<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npoeNA &lt;- function(v) {\r\n\tis.na(v) = v==9\r\n\treturn(v)\r\n}\r\ndados&lt;-apply(dados, 2, poeNA)\r\n<\/pre>\n<p>3) Calcular a matriz de correla\u00e7\u00e3o, removendo os valores em falta em <strong>listwise<\/strong>, e efetuar a an\u00e1lise fatorial, com extra\u00e7\u00e3o de 5 fatores e rota\u00e7\u00e3o <strong>varimax<\/strong>.<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\ncdados&lt;-cor(dados, use=\"complete.obs\")\r\ntemp.fit&lt;-principal(cdados, nfactors=5, rotate=\"varimax\")\r\nprint(temp.fit, digits=3, cutoff=.3)\r\n<\/pre>\n<p>Entretanto, tentei fazer outras rota\u00e7\u00f5es para al\u00e9m da Varimax e deparei com um problema: os resultados do R n\u00e3o coincidem com os do SPSS.<\/p>\n<p>A rota\u00e7\u00e3o <strong>varimax<\/strong> est\u00e1 no pacote base e faz a normaliza\u00e7\u00e3o de Kaiser por omiss\u00e3o. As outras rota\u00e7\u00f5es est\u00e3o noutros pacotes e tem que se pedir explicitamente para fazer a normaliza\u00e7\u00e3o de Kaiser. Para isso deve passar-se o par\u00e2metro <strong>normalize=TRUE<\/strong>, quando se chama a fun\u00e7\u00e3o &#8220;principal&#8221;. Mas ainda assim s\u00f3 consegui acertar a rota\u00e7\u00e3o <strong>oblimin<\/strong>. A <strong>promax<\/strong> e a <strong>quartimax<\/strong> n\u00e3o coincidem com o SPSS. [<a href=\"https:\/\/cran.r-project.org\/web\/packages\/psych\/psych.pdf\">1<\/a>] [<a href=\"https:\/\/cran.r-project.org\/web\/packages\/GPArotation\/GPArotation.pdf\">2<\/a>]<\/p>\n<p>Pesquisei mais e descobri que h\u00e1 uma fun\u00e7\u00e3o <strong>kaiser<\/strong> que pode ser invocada com dois par\u00e2metros: a solu\u00e7\u00e3o n\u00e3o rodada, e o tipo de rota\u00e7\u00e3o a fazer. Produz uma solu\u00e7\u00e3o rodada com a normaliza\u00e7\u00e3o de Kaiser.<br \/>\nConsegui resolver todas as rota\u00e7\u00f5es exceto a <strong>promax<\/strong>, que vem no pacote <strong>psych<\/strong> e funciona de forma diferente.<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\ntemp.fit&lt;-principal(cdados, nfactors=5, rotate=\"none\")\r\ntemp.fit&lt;-kaiser(temp.fit, rotate=\"quartimax\")\r\nprint(temp.fit, digits=3, cutoff=.3)\r\ntemp.fit$loadings\r\n\r\ntemp.fit&lt;-principal(cdados, nfactors=5, rotate=\"none\")\r\ntemp.fit&lt;-kaiser(temp.fit, rotate=\"oblimin\")\r\nprint(temp.fit, digits=3, cutoff=.3)\r\ntemp.fit$loadings\r\n<\/pre>\n<p>Aplica\u00e7\u00f5es de R, com interpreta\u00e7\u00e3o dos resultados em <a href=\"https:\/\/stat.cool\/base.php\">STAT.COOL<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O R \u00e9 uma ferramenta extremamente potente para fazer c\u00e1lculos estat\u00edsticos. Para al\u00e9m das estat\u00edsticas de base, \u00e9 poss\u00edvel adicionar outras estat\u00edsticas dispon\u00edveis em pacotes opcionais. Para a an\u00e1lise fatorial, por exemplo, \u00e9 necess\u00e1rio instalar um pacote extra. Eu estou a usar o psych e instalei-o assim, dentro do ambiente do R: install.packages(&#8220;psych&#8221;) Para efetuar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22333"}],"collection":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22333"}],"version-history":[{"count":13,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22333\/revisions"}],"predecessor-version":[{"id":22979,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22333\/revisions\/22979"}],"wp:attachment":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22333"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}