2011-08-28 22 views
6

(Thật không may, tôi thiếu từ vựng cơ bản để xây dựng câu hỏi của mình. Vì vậy, hãy sửa cho tôi biết các thuật ngữ chính xác hơn là hữu ích.)Cách tính tỷ lệ điểm dữ liệu, tức là kết hợp chúng dựa trên một số tiêu chí?

Tôi sử dụng R để phân tích thống kê cơ bản cho kết quả chuẩn của máy ảo. thường muốn chuẩn hóa dữ liệu của tôi dựa trên một số tiêu chí.

Hiện nay vấn đề của tôi là tôi muốn một cái gì đó như sau để làm việc:

normalized_data <- ddply(bench, ~ Benchmark + Configuration + Approach, 
         transform, 
         Ratio = Time/Time[Approach == "appr2"]) 

Vì vậy, những gì tôi thực sự muốn là để tính toán tốc độ lên giữa cặp đo tương ứng.

bench là một khung dữ liệu với các cột Thời gian, điểm chuẩn, cấu hình và phương pháp tiếp cận và chứa 100 phép đo cho tất cả các kết hợp có thể có của Điểm chuẩn, cấu hình và phương pháp tiếp cận. Bây giờ tôi đã có chính xác hai cách tiếp cận và muốn tăng tốc độ "appr2"/"appr1". Vì vậy, chỉ cần xem xét một điểm chuẩn cụ thể và một cấu hình cụ thể, tôi có 100 phép đo cho "appr1" và 100 của "appr2" trong khung dữ liệu của tôi. Tuy nhiên, R cung cấp cho tôi lỗi sau do truy vấn cung cấp:

Error in data.frame(list(Time = c(405.73, 342.616, 404.484, 328.742, 403.384, : 
    arguments imply differing number of rows: 100, 0 

Lý tưởng nhất, kết quả truy vấn của tôi sẽ tạo ra một khung dữ liệu mới với ba cột SpeedUp, Benchmark, Configuration. Dựa trên đó tôi sẽ có thể tính toán các phương tiện, khoảng tin cậy và vân vân.

Nhưng hiện tại, vấn đề cơ bản là cách thể hiện sự bình thường hóa như vậy. Đối với một tập dữ liệu khác, tôi đã có thể tính toán một giá trị chuẩn hóa như thế này Time.norm = Time/Time[NumCores == min(NumCores)] nhưng có vẻ như chỉ hoạt động một cách tình cờ, ít nhất tôi không hiểu sự khác biệt.

Mọi gợi ý đều được đánh giá cao. (Đặc biệt là thuật ngữ đúng để tìm kiếm các giải pháp cho các vấn đề đó.)

Chỉnh sửa: Nhờ gợi ý của Chase, đây là một tập dữ liệu tối thiểu, nên cấu trúc giống với những gì tôi nhận được, và nó thể hiện hành vi tương tự đối với truy vấn ở trên.

bench <- structure(list(Time = c(399.04, 388.069, 401.072, 361.646), 
      Benchmark = structure(c(1L, 1L, 1L, 1L), .Label = c("Fibonacci"), class = "factor"), 
      Configuration = structure(c(1L, 1L, 1L, 1L), .Label = c("native"), class = "factor"), 
      Approach = structure(c(1L, 1L, 2L, 2L), .Label = c("appr1", "appr2"), class = "factor")), 
     .Names = c("Time", "Benchmark", "Configuration", "Approach"), 
     row.names = c(NA, 4L), class = "data.frame") 
+0

Hi smarr - hãy xem câu hỏi này để biết các mẹo về xây dựng một câu hỏi kỹ thuật tốt: http://stackoverflow.com/questions/5963269/how-to-make-a- tuyệt vời-r-reproducible-ví dụ. Đặc biệt, hãy xem thêm 'dput (yourData)' – Chase

+0

Cảm ơn! Tôi đã thêm một tập dữ liệu ở trên. – smarr

+0

Arg, lỗi mới bắt đầu! – smarr

Trả lời

0

Hình như tôi vẫn bỏ lỡ khá một số khái niệm cơ bản trong R.

giải pháp nằm trong công thức sử dụng: ~ Benchmark + Configuration + Approach nhóm dữ liệu theo cả ba chiều, và t mũ không phải là những gì tôi thực sự cần. Tập dữ liệu kết quả thực sự chỉ chứa dữ liệu của "appr1" và đã chú ý đến tương quan.

Vì vậy, hãy thay đổi forumla thành ~ Benchmark + Configuration kết quả trong tập dữ liệu chứa dữ liệu "appr1" và "appr2" cho tất cả các phép đo Thời gian. Và sau đó, nó hoạt động như dự định :)

0

Nếu bạn cố gắng làm điều này trong vòng ddply theo cách tôi ngây thơ cố gắng lúc đầu, bạn thấy rằng bạn đang chỉ làm việc trong vòng loại cá nhân:

ddply(bench, ~ Benchmark + Configuration + Approach, 
          transform, 
          Ratio = Time/mean(Time[Approach == "appr2"])) 
#------------ 
Time Benchmark Configuration Approach  Ratio 
1 399.040 Fibonacci  native appr1  NaN 
2 388.069 Fibonacci  native appr1  NaN 
3 401.072 Fibonacci  native appr2 1.0516915 
4 361.646 Fibonacci  native appr2 0.9483085 

Rõ ràng không phải là điều được mong đợi. Bạn có thể tính toán một giá trị trung bình ngoài băng ghế dự bị là yếu tố bình thường:

meanappr2 <- mean(subset(bench, Approach == "appr2", Time)) 
    ddply(bench, ~ Benchmark + Configuration + Approach, 
          transform, 
          Ratio = Time/meanappr2) 
#-------------- 
Time Benchmark Configuration Approach  Ratio 
1 399.040 Fibonacci  native appr1 1.0463631 
2 388.069 Fibonacci  native appr1 1.0175950 
3 401.072 Fibonacci  native appr2 1.0516915 
4 361.646 Fibonacci  native appr2 0.9483085 

Nếu mặt khác bạn không muốn có một từng dòng bình thường mà là một sự so sánh nhóm chéo, sử dụng "tóm tắt" tùy chọn trong trong *ply hoạt động:

ddply(bench, ~ Benchmark + Configuration + Approach, 
          summarise, 
          Ratio = mean(Time)/meanappr2) 
#----------- 
    Benchmark Configuration Approach Ratio 
1 Fibonacci  native appr1 1.031979 
2 Fibonacci  native appr2 1.000000 
+0

Xin lỗi, tôi không rõ ràng về những gì tôi dự định. Tôi đã tìm ra giải pháp cho vấn đề của mình và đăng nó như một câu trả lời. Tuy nhiên, cảm ơn nhiều! – smarr

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