2011-08-28 4 views
6

(Niestety, brakuje mi podstawowego słownictwa, aby sformułować moje pytanie, więc proszę poprawić mi, gdzie bardziej precyzyjne terminy są przydatne.)Jak obliczyć stosunek punktów danych, tj. Połączyć je w oparciu o pewne kryterium?

Używam R do wykonywania bardzo podstawowych statystycznych analiz wyników benchmarków maszyn wirtualnych, a także często chcę znormalizować moje dane w oparciu o pewne kryterium.

Obecnie moim problemem jest to, że chciałbym coś jak następuje pracować:

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

Więc, co faktycznie chcę jest obliczenie przyspieszenia pomiędzy odpowiednimi parami pomiarów.

bench to ramka danych z kolumnami Czas, Benchmark, Konfiguracja i Podejście i zawiera 100 pomiarów dla wszystkich możliwych kombinacji Benchmark, konfiguracji i podejścia. Teraz mam dokładnie dwa podejścia i chcę przyspieszyć "appr2"/"appr1". Tak więc, patrząc tylko na jeden konkretny benchmark i jedną konkretną konfigurację, mam 100 pomiarów dla "appr1" i 100 z "appr2" w mojej ramce danych. Jednak R daje mi następujący błąd wynikający z zapytania podać:

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 

Idealnie, wynik mojego zapytania skutkowałoby w nowej ramce danych z trzech kolumn SpeedUp, Benchmark, konfiguracja. Na tej podstawie będę w stanie obliczyć średnie, przedziały ufności i tak dalej.

Ale w tej chwili podstawowym problemem jest sposób wyrażenia takiej normalizacji. Dla innego zestawu danych udało mi się obliczyć znormalizowaną wartość, taką jak ta Time.norm = Time/Time[NumCores == min(NumCores)], ale wygląda na to, że działało przez przypadek, przynajmniej nie rozumiem różnicy.

Wszelkie wskazówki są mile widziane. (Zwłaszcza właściwa terminologia do szukania rozwiązań dla takich problemów.)

Edycja: Dzięki wskazówce Chase'a, tutaj minimalny zestaw danych, który powinien być strukturalnie identyczny z tym, który otrzymałem i wykazuje takie samo zachowanie w odniesieniu do powyższe zapytanie.

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 - zobacz to pytanie, aby uzyskać porady dotyczące sformułowania dobrego pytania technicznego: http://stackoverflow.com/questions/5963269/how-to-makea-a- świetny-odtwarzalny-przykład. W szczególności spójrz na dodanie 'dput (yourData)' – Chase

+0

Dzięki! Dodałem zestaw danych powyżej. – smarr

+0

Arg, błąd dla początkujących! – smarr

Odpowiedz

0

Wygląda na to, że nadal brakuje sporo podstawowych pojęć w R.

rozwiązaniem jest używane wzoru: ~ Benchmark + Configuration + Approach grupach dane według wszystkich trzech wymiarach, a t kapelusz nie jest tym, czego naprawdę potrzebuję. Wynikowy zestaw danych rzeczywiście zawierał tylko dane "appr1", a do tego nie było żadnych korelacji.

Zmiana zestawu danych na ~ Benchmark + Configuration powoduje, że zestaw danych zawiera dane "appr1" i "appr2" dla wszystkich pomiarów czasu. A następnie działa zgodnie z przeznaczeniem :)

0

Jeśli spróbujesz zrobić to w ciągu ddply w sposób naiwnie próbował na początku, można zauważyć, że pracują tylko w poszczególnych kategoriach:

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 

Oczywiście nie, co było spodziewać. Można obliczyć średnią wartość poza ławce być czynnikiem normalizacja:

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 

Jeśli z drugiej strony nie chciał się linia po linii normalizacji ale raczej przekrój porównania grupy, użyj „podsumować” opcję zasięgu w *ply operacji:

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

Przepraszam, nie byłem wystarczająco jasny o tym, co zamierzałem. Znalazłem rozwiązanie mojego problemu i opublikowałem go jako odpowiedź. Mimo to, wielkie dzięki! – smarr

Powiązane problemy