Как рассчитать соотношение точек данных, т. Е. Объединить их по какому-либо критерию? - PullRequest
6 голосов
/ 28 августа 2011

(К сожалению, мне не хватает базового словарного запаса для формулировки моего вопроса. Поэтому, пожалуйста, исправьте меня, где более точные термины полезны.)

Я использую R для проведения базового статистического анализа для результатов тестирования виртуальных машин.и я часто хочу нормализовать свои данные на основе какого-то критерия.

В настоящее время моя проблема заключается в том, что я хотел бы, чтобы что-то вроде следующего работало:

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

Итак, что я действительно хочупредназначен для расчета ускорения между соответствующими парами измерений.

bench - это фрейм данных со столбцами Time, Benchmark, Configuration and Approach и содержит 100 измерений для всех возможных комбинаций Benchmark, Configuration and Approach,Теперь я получил ровно два подхода и хочу ускорить "appr2" / "appr1".Таким образом, просто глядя на один конкретный тест и одну конкретную конфигурацию, у меня есть 100 измерений для «appr1» и 100 «appr2» в моем фрейме данных.Однако R выдает мне следующую ошибку, полученную в результате запроса на выдачу:

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

В идеале результатом моего запроса будет новый фрейм данных с тремя столбцами SpeedUp, Benchmark, Configuration.Исходя из этого, я мог бы тогда рассчитать средние значения, доверительные интервалы и т. Д.

Но на данный момент основная проблема заключается в том, как выразить такую ​​нормализацию.Для другого набора данных мне удалось вычислить нормализованное значение, подобное этому Time.norm = Time / Time[NumCores == min(NumCores)], но, похоже, это сработало случайно, по крайней мере я не понимаю разницы.

Любые подсказки приветствуются.(Особенно правильная терминология для поиска решений таких проблем.)

Редактировать: Благодаря подсказке Чейза, здесь минимальный набор данных, который должен быть структурно идентичен тому, что я получил, и он демонстрирует то же поведение суважение к запросу выше.

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")

Ответы [ 2 ]

0 голосов
/ 29 августа 2011

Похоже, я до сих пор скучаю по целому ряду основных понятий в R.

Решение заключается в используемой формуле: ~ Benchmark + Configuration + Approach группирует данные по всем трем измерениям, и это не то, что я на самом деленеобходимость.Результирующий набор данных на самом деле просто содержал данные "appr1", и не осталось ничего, чтобы соотноситься с.

Таким образом, изменение forumla на ~ Benchmark + Configuration приводит к набору данных, который содержит "appr1" и "примерно 2 "данные для всех измерений времени.И тогда, это работает как задумано:)

0 голосов
/ 28 августа 2011

Если вы попытаетесь сделать это в ddply так, как я сначала наивно пытался, вы обнаружите, что работаете только в отдельных категориях:

  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

Очевидно, что это не то, на что надеялись.Вы можете рассчитать среднее значение вне стенда как коэффициент нормализации:

 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

Если, с другой стороны, вы не хотите построчную нормализацию, а скорее сравнение между группами, используйте "суммирование"опция в операциях *ply:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...