2013-04-10 23 views
7

Tôi đang cố gắng chạy phân tích đối sánh tối ưu bằng TraMineR nhưng có vẻ như tôi đang gặp sự cố với kích thước của tập dữ liệu. Tôi có một tập dữ liệu lớn của các quốc gia châu Âu có chứa phép thuật việc làm. Tôi có hơn 57.000 chuỗi dài 48 đơn vị và bao gồm 9 trạng thái riêng biệt. Để có được một ý tưởng về việc phân tích, đây là người đứng đầu của đối tượng chuỗi employdat.sts:Sự cố với dữ liệu lớn (?) Trong khi tính toán khoảng cách trình tự bằng cách sử dụng TraMineR

[1] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-... 
[2] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-... 
[3] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-... 
[4] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-... 
[5] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-... 
[6] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-... 

Trong một định dạng SPS ngắn hơn, điều này lần đọc như sau:

Sequence    
[1] "(EF,48)"    
[2] "(EF,48)"    
[3] "(ST,48)"    
[4] "(ST,36)-(MS,3)-(EF,9)" 
[5] "(EF,48)"    
[6] "(ST,24)-(EF,24)" 

Sau khi vượt qua đối tượng chuỗi này đến hàm seqdist(), tôi nhận được thông báo lỗi sau:

employdat.om <- seqdist(employdat.sts, method="OM", sm="CONSTANT", indel=4)  
[>] creating 9x9 substitution-cost matrix using 2 as constant value 
[>] 57160 sequences with 9 distinct events/states 
[>] 12626 distinct sequences 
[>] min/max sequence length: 48/48 
[>] computing distances using OM metric 
Error in .Call(TMR_cstringdistance, as.integer(dseq), as.integer(dim(dseq)), : negative length vectors are not allowed 

Lỗi này có liên quan đến số lượng lớn disti nct, chuỗi dài? Tôi đang sử dụng một máy x64 với RAM 4GB và tôi cũng đã thử nó trên một máy tính với bộ nhớ RAM 8 GB mà sao chép thông báo lỗi. Có ai đó biết cách giải quyết lỗi này không? Bên cạnh đó, phân tích cho từng quốc gia sử dụng cùng cú pháp với chỉ mục cho quốc gia hoạt động tốt và tạo ra kết quả có ý nghĩa.

+0

vui lòng hiển thị mã của bạn – sashkello

Trả lời

8

Tôi chưa bao giờ thấy mã lỗi này trước đây, nhưng nó cũng có thể là do số lượng trình tự cao của bạn. Có ít nhất hai việc bạn có thể thử làm:

  • sử dụng đối số "full.matrix=FALSE" trong seqdist (xem trang trợ giúp). Nó sẽ chỉ tính toán ma trận tam giác dưới và trả về một đối tượng "dist" có thể được sử dụng trực tiếp trong hàm hclust.
  • Bạn có thể tổng hợp chuỗi giống nhau (bạn chỉ có 12626 trình tự riêng biệt thay vì 57160 chuỗi), tính toán khoảng cách, phân cụm các chuỗi sử dụng trọng số (được tính theo số lần mỗi chuỗi riêng biệt xuất hiện trong tập dữ liệu) và sau đó thêm cụm lại vào tập dữ liệu ban đầu của bạn. Điều này có thể được thực hiện khá dễ dàng bằng cách sử dụng thư viện WeightedCluster. Phụ lục đầu tiên của Sổ tay WeightedCluster cung cấp hướng dẫn từng bước để thực hiện điều đó (quy trình cũng được mô tả trên trang web http://mephisto.unige.ch/weightedcluster).

Hy vọng điều này sẽ hữu ích.

+0

Rất tiếc, đối số "full.matrix = FALSE" không giải quyết được sự cố. Nhưng tôi sẽ thử phương pháp clustered trọng số, điều này có vẻ thực sự là một cách tiếp cận rất hứa hẹn vì nó làm giảm số lượng hàng và cột nhiều hơn 4 lần. –

+1

Sử dụng hàm tổng hợp và trọng số của gói 'WeightedCluster' đã làm việc cho tập dữ liệu của tôi. Các mô tả trong phụ lục của hướng dẫn sử dụng thực sự là rất hữu ích. Cảm ơn bạn! –

2

Một giải pháp dễ dàng thường hoạt động tốt là chỉ phân tích mẫu của dữ liệu của bạn. Ví dụ:

employdat.sts <- employdat.sts[sample(nrow(employdat.sts),5000),] 

sẽ trích xuất một mẫu ngẫu nhiên 5000 chuỗi. Việc khám phá một mẫu quan trọng như vậy phải đủ lớn để tìm ra các đặc tính của các trình tự của bạn, bao gồm cả sự đa dạng của chúng.

Để cải thiện tính đại diện, bạn thậm chí có thể sử dụng một số mẫu lấy mẫu phân tầng (ví dụ: theo trạng thái đầu tiên hoặc cuối cùng hoặc một số biến số có sẵn trong tập dữ liệu của bạn). Vì bạn có sẵn bộ dữ liệu ban đầu, bạn hoàn toàn có thể kiểm soát thiết kế lấy mẫu ngẫu nhiên.

Các vấn đề liên quan