Ошибка цикла for и мин. 2,5% и макс. 97,5% процентиль в R

У меня есть набор данных с 41 строкой и 21 столбцом. В DF каждая строка представляет данные об энергии за 15-минутный интервал дня (с 10:00 до 20:00). каждый столбец представляет выбранные дни в течение месяца месяц.

Мне нужно выяснить изменчивость нагрузки (стандартное отклонение/среднее значение) ч/б по две строки в каждом столбце, используя следующее уравнение.

http://i.stack.imgur.com/inOKV.jpg

То есть между 1-м и 2-м; 1-й, 2-й и 3-й; 1-4; 1-5; и т.д. элемент каждого столбца.

Я продолжаю получать значения NA в «lv» и удивляюсь, почему. Конечный результат: lv должен иметь кадр данных 41x21, такой же, как df, но с изменчивостью нагрузки.

Кроме того, как мне также получить 2,5 и 97,5 процентили в цикле, кроме изменчивости нагрузки?

x <- df[1:41,1:21]

#calculate load variability 
count = 0
i=1{
for (i in 1:41){
     count = count+1  
     mean = sum (x[1:l,])/count
     diff = ((x-mean)^2)
     lv= sqrt((diff/(count+1)-1)/mean)
         i = i+1
  }
}
lv

lv заканчивается нулевыми значениями (NA).


person Python_R    schedule 14.08.2012    source источник
comment
Для начала, внутри вы переназначаете x, что означает, что внутри вашего цикла вы потеряете исходные данные.   -  person seancarmody    schedule 14.08.2012
comment
Вы пытаетесь вычислить sd/mean для каждой строки, или вы действительно пытаетесь вычислить его по всем данным для первых i строк в вашем цикле?   -  person seancarmody    schedule 14.08.2012
comment
Я пытаюсь sd/mean для каждой строки.   -  person Python_R    schedule 14.08.2012
comment
Во-первых: что такое df? Далее: вы уменьшили x с массива 41 x 63 до массива 1 x 63, поэтому в следующий раз через цикл вы превысите текущие размеры x. Вы забыли написать, что получили сообщение об ошибке.   -  person Carl Witthoft    schedule 14.08.2012
comment
Вопрос до сих пор не ясен, даже после редактирования. Вы ссылаетесь на изменчивость нагрузки между столбцами. Однако ваша формула, которая представляет собой просто sd/mean, является мерой для одного набора данных. Вы также говорите, что хотите, чтобы результат имел те же размеры, что и исходные данные. Итак, какой должна быть первая запись в первой строке? SD/среднее значение одной точки данных, т.е. 0?   -  person seancarmody    schedule 15.08.2012
comment
Извините, я изо всех сил старался объяснить сложные задачи, над которыми я работал здесь, но, похоже, у меня это не получилось. Я решил эту проблему сейчас с некоторой помощью. Спасибо за помощь   -  person Python_R    schedule 15.08.2012


Ответы (2)


Если вы хотите рассчитать sd/mean для каждой строки, попробуйте:

apply(x, 1, sd)/rowMeans(x)

Если вам нужен уровень достоверности 2,5% и 97,5% для каждой строки, попробуйте:

apply(x, 1, quantile, c(.025, 0.975))
person seancarmody    schedule 14.08.2012
comment
ниндзя! Но быстренько: переверни так, чтобы было sd/mean :-) - person Carl Witthoft; 14.08.2012
comment
слишком быстро вырезал и вставлял! - person seancarmody; 14.08.2012
comment
Спасибо, а как это вычислить в цикле for? - person Python_R; 14.08.2012
comment
Весь смысл в том, чтобы использовать apply, чтобы избежать использования цикла. Но если вам нужно :-), просто измените свой код: удалите строку x<-x[1:i.... и замените вычисление на mean = sum(x[i,])/count . Также обратите внимание, что использование среднего значения и различия для переменных не рекомендуется, поскольку это функции в базовых пакетах R. - person Carl Witthoft; 14.08.2012
comment
Как указывает Карл, применение позволяет избежать цикла: оно просто выдает результаты для каждой строки. Подумайте о векторизации! - person seancarmody; 14.08.2012
comment
Я думаю, что я не был ясен в своем вопросе. Мне понадобятся строки sd/mean b/w для каждого столбца. Таким образом, у меня была бы матрица lv 41x21 даже для конечного результата. - person Python_R; 14.08.2012
comment
То есть, если я правильно понимаю, для каждого столбца: получить загрузку для элемента 1 и 2, затем 1, 2 и 3, затем 1-4, 1-5 и т.д.? В результате чего будет на 1 строку меньше исходных данных? - person sebastian-c; 14.08.2012

Хорошо, после нескольких попыток (и некоторой помощи от этот вопрос), у меня наконец есть:

cumul_loading <- function(x, leave.nan=FALSE){
  ind_na <- !is.na(x)
  nn <- cumsum(ind_na)
  x[!ind_na] <- 0

  cumul_mean <- cumsum(x) / nn
  cumul_sd <- sqrt(cumsum(x^2) / (nn-1) - (cumsum(x))^2/(nn-1)/nn)

  if(leave.nan) return(cumul_sd / cumul_mean) else 
    return((cumul_sd / cumul_mean)[-1])
}

В нем должно быть несколько ошибок (например, что делать с NA), но теперь он должен работать с функцией apply. Аргумент leave.nan необязательно оставляет NaN, созданный, когда n_len - 1 = 0

apply(x, 2, cumul_loading)
person sebastian-c    schedule 14.08.2012