Время нормализует переменную силы прыжка в R

У меня есть набор данных, который содержит вертикальную силу реакции земли для двух вертикальных прыжков, выполненных одним спортсменом. Это непрерывная переменная. У меня также есть столбец, в котором указано смещение спортсмена, которое также является непрерывной переменной. Данные отбираются с частотой 500 Гц для обоих прыжков, но для выполнения прыжка № 1 потребовалось больше времени, чем для прыжка № 2, поэтому он имеет большее количество строк.

Я хочу нормализовать смещение от каждого прыжка по шкале от 0 до 100% от общего смещения, чтобы получить переменную силы равной длины для обоих прыжков. Затем я хочу рассчитать среднее значение кривой зависимости силы от смещения по прыжкам.

Поскольку набор данных довольно длинный, я включил сокращенный пример того, как данные существуют в настоящее время и как я хочу, чтобы они выглядели в конечном итоге. Я надеюсь, что кто-то сможет предложить хороший подход для нормализации смещения по шкале от 0 до 100% и обеспечения одинакового количества строк для каждого прыжка.

NB: в приведенном ниже коде я решил представить частоту дискретизации 10 Гц, просто чтобы проиллюстрировать, как данные настраиваются простым способом, чтобы я мог получить несколько советов по своему подходу.

Текущая структура необработанных данных:

Jump_Number     Displacement    Force    Time
     1               0           800       0
     1             -0.10         700       0.1
     1             -0.29         500       0.2
     1             -0.40         200       0.3
     1             -0.45         100       0.4
     1             -0.50         500       0.5
     1             -0.30         800       0.6
     1             -0.10         1200      0.7
     1             -0.05         1300      0.8
     1              0.05         1250      0.9
     2               0           800       0.0
     2             -0.10         678       0.1
     2             -0.29         499       0.2
     2             -0.40         178       0.3
     2             -0.45         90        0.4
     2             -0.50         600       0.5
     2             -0.40         810       0.6
     2             -0.35         999       0.7
     2             -0.29         1135      0.8
     2             -0.10         1250      0.9
     2             -0.05         1401      1.0
     2              0.05         1345      1.1

Желаемая нормализованная структура данных:

  Jump_Number     Normalized_Displacement_(%)  Force    
     1                     0                    800       
     1                    10                    700       
     1                    20                    500       
     1                    30                    200       
     1                    40                    100       
     1                    50                    500       
     1                    60                    800       
     1                    70                    1200      
     1                    80                    1300      
     1                    90                    1289
     1                   100                    1250     
     2                    0                     800       
     2                   10                     678      
     2                   20                     499       
     2                   30                     178       
     2                   40                     90        
     2                   50                     600       
     2                   60                     810       
     2                   70                     999       
     2                   80                     1135      
     2                   90                     1250      
     2                  100                     1345      

person Matt Jordan    schedule 19.05.2016    source источник
comment
Не совсем понятно, почему вы называете результирующее нормализованное смещение столбца, если значения в желаемом результате не соответствуют примеру. Я бы подумал, что нормализацию можно сделать так: (Displacement - min) / range * 100 .   -  person Bulat    schedule 20.05.2016


Ответы (1)


Я предполагаю, что вы на самом деле не ожидаете, что силы, соответствующие «нормализованному смещению», будут равны силам для исходных смещений. Исходя из этого предположения, вы можете использовать приведенный ниже сценарий для получения необходимых данных.

require(ggplot2)

# Read the data
jump_names = c("Jump_Number", "Displacement", "Force", "Time")
jump_data = transpose(data.frame(
     c(1, 0, 800, 0),
     c(1, -0.10, 700, 0.1),
     c(1, -0.29, 500, 0.2),
     c(1, -0.40, 200, 0.3),
     c(1, -0.45, 100, 0.4),
     c(1, -0.50, 500, 0.5),
     c(1, -0.30, 800, 0.6),
     c(1, -0.10, 1200, 0.7),
     c(1, -0.05, 1300, 0.8),
     c(1, 0.05, 1250, 0.9),
     c(2, 0, 800, 0.0),
     c(2, -0.10, 678, 0.1),
     c(2, -0.29, 499, 0.2),
     c(2, -0.40, 178, 0.3),
     c(2, -0.45, 90, 0.4),
     c(2, -0.50, 600, 0.5),
     c(2, -0.40, 810, 0.6),
     c(2, -0.35, 999, 0.7),
     c(2, -0.29, 1135, 0.8),
     c(2, -0.10, 1250, 0.9),
     c(2, -0.05, 1401, 1.0),
     c(2, 0.05, 1345, 1.1)))
names(jump_data) =  jump_names
jump_data$Jump_Number = as.factor(jump_data$Jump_Number)

# Compute percent displacement
jump_data$Total_Displacement = ave(abs(jump_data$Displacement), jump_data$Jump_Number, FUN = cumsum)
jump_data$Max_Displacement = ave(abs(jump_data$Total_Displacement), jump_data$Jump_Number, FUN = max)
jump_data$Percent_Displacement = jump_data$Total_Displacement/jump_data$Max_Displacement*100

# Split the data
jump_data_split = split(jump_data, jump_data$Jump_Number)

# Apply interpolation and the combine
interp_data = data.frame()
for (ii in 1:length(jump_data_split)) {
  linear_interp = data.frame(approx(jump_data_split[[ii]]$Percent_Displacement, 
                jump_data_split[[ii]]$Force, 
                xout = seq(0, 100, by = 10), 
                method = "linear"))
  linear_interp$Jump_Number = paste0(ii, "interp")
  interp_data = rbind(interp_data, linear_interp)
}
interp_data$Jump_Number = as.factor(interp_data$Jump_Number)
names(interp_data) = c("Percent_Displacement", "Force", "Jump_Number")

# Plots
plt = ggplot(jump_data,
             aes(x = Time, y = -Displacement, 
                 color = Jump_Number, group = Jump_Number)) +
      geom_path() + 
      theme_bw()
print(plt)
dev.copy(png, "disp_time.png")
dev.off()

dev.new()
plt0 = ggplot(jump_data,
             aes(x = Time, y = Total_Displacement, 
                 color = Jump_Number, group = Jump_Number)) +
      geom_path() + 
      theme_bw()
print(plt0)
dev.copy(png, "tot_disp_time.png")
dev.off()

dev.new()
plt1 = ggplot(jump_data,
             aes(x = Time, y = Force, 
                 color = Jump_Number, group = Jump_Number)) +
      geom_path() + 
      theme_bw()
print(plt1)
dev.copy(png, "force_time.png")
dev.off()

dev.new()
plt2 = ggplot()+
         geom_path(data = jump_data, aes(x = Percent_Displacement, y = Force, 
                 color = Jump_Number, group = Jump_Number)) +
         geom_path(data = interp_data, aes(x = Percent_Displacement, y = Force, 
                 color = Jump_Number, group = Jump_Number)) +
      theme_bw()
print(plt2)
dev.copy(png, "force_percent_disp.png")
dev.off()

names(interp_data) = c("Normalized_Displacement_(%)", "Force", "Jump_Number")
print(interp_data)

Один из сюжетов, созданных сценарием:

percent_displacement_time

person Biswajit Banerjee    schedule 20.05.2016