2012-09-08 12 views
9

Mam tablicę danych tablicy kontyngencji z 6 kolumnami i 37 wierszami. Potrzebuję zastosować transformację Chi, aby uzyskać profile wierszy i profile kolumn do analizy korespondencji.Transformacja danych unikająca pętli zagnieżdżonych w R

Niestety, powiedziano mi, że będę musiał użyć pętli zagnieżdżonych do transformacji danych i przeprowadzenia CA (zamiast robić to rozsądniej w R). Dostałam strukturę użyć do mojego zagnieżdżonej pętli:

transformed.data=data0 

for (row.index in 1:nrow(data)) { 
    for (col.index in 1:ncol(data)) { 
    transfomed.data[row.index,col.index]= 
     "TRANSFORMATION"[row.index,col.index] 
    } 
} 

Z tego co rozumiem, za pomocą zagnieżdżonych pętli będzie stosować mój „transformacja” pierwszy wierszy, a następnie do kolumn.

Transformacja chcę zrobić na danych, aby uzyskać profili wierszy to:

( X (ij)/suma (X (i)) )/sqrt (suma (X (j)))

Choć transformacja chcę zrobić na danych, aby uzyskać profili kolumn jest:

( X (ij)/suma (X (j)) )/sqrt (suma (X (i)))

Co chciałbym wprowadzić jako mój „TRANSFO RMATION " w ostatnim wierszu zagnieżdżonej pętli, aby uzyskać żądaną transformację dla profili. W przeciwnym razie, jeśli tęsknię za zrozumieniem punktu pętli zagnieżdżonej, proszę opisać, co mi to pozwoli.

Jest to kod dla podzbioru moich danych:

matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964) 
,nrow=4,ncol=4,byrow=T) 

więc za pomocą tego podzbioru sam spodziewałbym profil wiersza dla pierwszego rzędu, aby być:

0.002432689 0.0003291397 6.506803e-05 5.794379e-05 

a kolumna profil dla pierwszej kolumny to:

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 
+0

można dodać kilka przykładowych danych, aby Twoje pytanie [powtarzalne] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? Potrzebny będzie zestaw danych wejściowych i oczekiwany wynik. Czy szukałeś również wbudowanych funkcji? Pierwsze trafienie w google dało mi [to] (http://www.statmethods.net/advstats/ca.html). – Chase

+0

Dzięki Chase, dodam tylko niektóre przykładowe dane do pierwszego postu. W odniesieniu do twojego drugiego pytania do tego zadania, muszę najpierw wykonać analizę korespondencji krok po kroku, przekształcając dane (bit, w którym utknąłem) i robiąc PCA na tym, a następnie robiąc to rozsądniejszymi sposobami przez corresp (oryginalne dane) i ca (oryginalne dane) – Confused

+0

Brzmi jak zadanie domowe? Kilka rad. 1) nie potrzebujesz żadnych pętli, 2) twoja formuła może być znacznie łatwiejsza, jeśli użyjesz 'colSums()' i 'rowSums()' 3) gdy wszystko inne zawiedzie, możesz spojrzeć na kod źródłowy funkcji aby zobaczyć, jak inni autorzy rozwiązali ten sam problem. Aby to zrobić, wpisz nazwę funkcji bez parens w konsoli. Ta * może * być funkcją jednoliniową z powyższymi informacjami. – Chase

Odpowiedz

1

Możesz użyć tego w tych typach obliczeń bez potrzebuje nawet jednej pętli.Przepisz równanie, a następnie pojawi się:

Xtrans [i, j] = X [i, j]/( suma (X [I]) * sqrt (sum (X [i, j])) )

Aby uzyskać macierz reprezentującą określony - suma (X [I]) * sqrt (sum (X [i, j])) - użyć funkcja outer() lub tak:

rowSums(X) %o% sqrt(colSums(X)) 

lub, w przypadku przekształcenia kolumna:

sqrt(rowSums(X)) %o% colSums(X) 

Jedyną rzeczą, którą musisz zrobić, to podzielić swoją oryginalną matrycę przez ten jeden, na przykład do przekształcenia Szyjka:

TEST <- matrix(
       c(15366,2079,411,366,23223,2667,699,819, 
       31632,2724,717,1473,49938,3111,1062,11964), 
       nrow=4,ncol=4,byrow=T) 

> TEST/(sqrt(rowSums(TEST)) %o% colSums(TEST)) 
      [,1]  [,2]  [,3]   [,4] 
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284 
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284 
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580 
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055 

W przybliżeniu w ten sam sposób można obliczyć transformację wiersza.

Wykonując obliczenia ręczne, mogę potwierdzić, że moje rozwiązanie jest poprawne, o ile zrozumiałem poprawnie notację indeksu (co oznacza, że ​​ja oznacza wiersze, a j w przypadku kolumn). Liczby, których się spodziewasz, nie są tymi, których oczekujesz. Aby pokazać wam:

> (TEST[1,2]/sum(TEST[,2]))/sqrt(sum(TEST[1,])) 
[1] 0.001455559 

chi-kwadrat można mówić o normalizacji, w rzeczywistości może być znaleziony w funkcji decostand pakietu vegan. Pamiętaj, że domyślnie metoda dostosowuje się przez pomnożenie przez pierwiastek kwadratowy z sumy macierzy. Ma to sens w analizie korespondencji.

Jeśli nie chcesz korzystać z tej korekty, a następnie można uzyskać np transformację kolumny również następująco:

> require(vegan) 
> decostand(TEST,method="chi.square",MARGIN=2)/sqrt(sum(TEST)) 
      [,1]   [,2]  [,3]  [,4] 
[1,] 0.0009473414 0.0011674098 0.001377052 0.001616800 
[2,] 0.0014555588 0.0015225011 0.001346668 0.001143812 
[3,] 0.0010538924 0.0014614736 0.001298230 0.001430074 
[4,] 0.0001854284 0.0003383284 0.000526958 0.003183106 
attr(,"decostand") 
[1] "chi.square" 
+0

Wiem, że to praca domowa, ale domyślam się, że jesteśmy dobrze zdane na termin wykonania zadania, dlatego dodajemy rozwiązanie, które w rzeczywistości jest R –