2012-09-08 23 views
9

Tôi có ma trận dữ liệu bảng dự phòng với 6 cột và 37 hàng. Tôi cần áp dụng phép biến đổi Chi bình phương để cung cấp cho tôi Hồ sơ hàng và Cấu hình cột cho một phân tích tương ứng.Chuyển đổi dữ liệu tránh các vòng lặp lồng nhau trong R

Thật không may tôi đã được thông báo rằng tôi sẽ cần phải sử dụng vòng lặp lồng nhau để chuyển đổi dữ liệu và thực hiện CA (thay vì thực hiện theo cách hợp lý hơn trong R). Tôi đã được đưa ra cấu trúc để sử dụng cho vòng lặp lồng nhau của tôi:

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] 
    } 
} 

Từ những gì tôi hiểu bằng cách sử dụng các vòng lặp lồng nhau nó sẽ được áp dụng tôi "CHUYỂN" đầu tiên các hàng và sau đó đến cột.

Việc chuyển đổi tôi muốn thực hiện trên các dữ liệu để có được các cấu hình liên tiếp là:

( X (ij)/sum (X (i)) )/sqrt (tổng (X (j)))

Trong khi việc chuyển đổi tôi muốn thực hiện trên các dữ liệu để có được các cấu hình cột là:

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

tôi sẽ nhập gì như "sự chuyển tiếp của tôi RMATION " trong dòng cuối cùng của vòng lặp lồng nhau để có được nó để xuất chuyển đổi mong muốn của tôi cho các cấu hình. Nếu không, nếu tôi đã bỏ lỡ hiểu được điểm của một vòng lặp lồng nhau ở đây hãy mô tả những gì nó sẽ cho phép tôi làm.

Đây là mã cho một tập hợp con của dữ liệu của tôi:

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

Vì vậy, sử dụng nhóm này một mình tôi mong chờ hồ sơ cá nhân hàng cho hàng đầu tiên là:

0.002432689 0.0003291397 6.506803e-05 5.794379e-05 

Và cột tiểu sử cho cột đầu tiên là:

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 
+0

bạn có thể thêm một số dữ liệu mẫu để làm cho câu hỏi của bạn [tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? Một số liệu đầu vào và kết quả mong đợi của bạn sẽ là cần thiết. Ngoài ra, bạn đã tìm kiếm các chức năng tích hợp chưa? Lần truy cập đầu tiên trên google đã cho tôi [this] (http://www.statmethods.net/advstats/ca.html). – Chase

+0

Cảm ơn Chase, tôi sẽ thêm một số dữ liệu mẫu vào bài đăng đầu tiên. Liên quan đến câu hỏi thứ hai của bạn cho bài tập này, trước tiên tôi phải thực hiện phân tích tương ứng từng bước bằng cách chuyển đổi dữ liệu (bit mà tôi đang mắc kẹt) và thực hiện PCA và sau đó thực hiện theo các cách hợp lý hơn bằng cách sửa lỗi (dữ liệu gốc) và ca (dữ liệu gốc) – Confused

+0

Âm thanh như bài tập về nhà? Một vài lời khuyên. 1) bạn không cần bất kỳ vòng lặp nào, 2) công thức của bạn có thể được thực hiện dễ dàng hơn nhiều nếu bạn sử dụng 'colSums()' và 'rowSums()' 3) khi mọi thứ khác thất bại, bạn có thể xem mã nguồn của các hàm để xem các tác giả khác đã giải quyết vấn đề tương tự như thế nào. Để thực hiện việc này, hãy nhập tên hàm mà không có dấu ngoặc vào bảng điều khiển. Điều này * có thể * là một chức năng một dòng với các thông tin trên. – Chase

Trả lời

1

Bạn có thể sử dụng tính năng này trong các loại tính toán này mà không cần cần một vòng lặp đơn.Viết lại phương trình của bạn, và sau đó bạn nhận được:

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

Để có được một ma trận đại diện cho hạn - sum (X [i,]) * sqrt (sum (X [, j])) - bạn sử dụng chức năng outer() hoặc %o% như thế này:

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

Hoặc, đối với việc chuyển đổi cột:

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

Điều duy nhất bạn cần làm là chia ma trận ban đầu của bạn bằng cách thế này, ví dụ như đối với việc chuyển đổi col:

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 

Trong cùng một cách bạn có thể tính toán phép chuyển đổi hàng.

Thực hiện các phép tính tay, tôi có thể xác nhận rằng giải pháp của tôi là chính xác, miễn là tôi hiểu ký hiệu chỉ mục của bạn một cách chính xác (nghĩa là i là viết tắt của hàng và j cho cột). Những con số bạn mong đợi không phải là số bạn nói bạn mong đợi. Để hiển thị bạn:

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

Các chi-vuông bình thường bạn nói về, thực sự có thể được tìm thấy trong chức năng decostand của gói vegan. Hãy nhớ rằng theo mặc định, phương thức điều chỉnh bằng cách nhân với căn bậc hai của tổng ma trận. Điều này có ý nghĩa trong một phân tích tương ứng.

Nếu bạn không muốn sử dụng điều chỉnh này, sau đó bạn có thể nhận được ví dụ như việc chuyển đổi cột cũng như sau:

> 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

Tôi biết đây là bài tập về nhà, nhưng tôi đoán chúng tôi đã vượt qua đúng hạn cho bài tập, do đó thêm một giải pháp thực sự là R –