Как найти среднее значение и стандартное отклонение одной переменной для групп квантилей другой переменной

Я пытался найти ответ на другие вопросы, но либо из-за того, что другие вопросы были очень конкретными, либо сформулированы запутанно, я не смог найти точную информацию, применимую к моей ситуации. Вот оно:

У меня есть, скажем, две переменные и по 100 наблюдений за каждой:

V1 <- rnorm(100, 0, 1) 
V2 <- rpois(100, 4) 
data <- cbind(V1, V2)

Я хочу сгруппировать участников на основе того, в какой квантили они попадают по одной переменной, скажем, V1, а затем вычислить среднее значение и стандартное отклонение V2 для каждой квантильной группы.

Ключевое примечание: я хочу создать группы на основе того, сколько стандартных отклонений они составляют от среднего значения V1. Таким образом, мои квантильные группы должны быть примерно такими: нижние 2%, 2-я p-плитка до 16-й, 16-я до 50-й, 50-я до 84-й, 84-й до 98-й и верхние 2%.


person Dij    schedule 18.12.2018    source источник
comment
Прошло некоторое время с тех пор, как я использовал это, поэтому я не уверен, как это работает, но вы можете добавить аргумент quantile к части breaks cut, чтобы создать дополнительный столбец, помечающий данные на основе того, какой квантиль он появляется. Я попробовал следующее, но это неправильно, однако подход может быть data %>% mutate( quant = cut(V1, breaks = quantile(V1, prob = c(0.02, 0.16, 0.5, 0.84, 0.98))). Этот вопрос касается аналогичного stackoverflow.com/questions/4126326/   -  person NColl    schedule 18.12.2018
comment
Спасибо, NColl, это немного помогло, но ручное создание квантилей с вектором вероятностей по какой-то причине дало мне несколько NA... это было очень полезно!   -  person Dij    schedule 18.12.2018


Ответы (1)


Вместо вычисления квантилей вы можете просто масштабировать данные по единицам и использовать целые числа в качестве точек отсечки для категорий.

Добавляем масштабируемый столбец:

data <- data.frame(data, V3 = scale(V1))

Затем разделите данные на категории с точками отсечения от -3 до 3:

data$cats <- cut(data$V3, -3:3, labels = letters[1:6])

Наконец, мы агрегируем, чтобы получить среднее значение и стандартное отклонение V2 для каждой группы.

aggregate(V2 ~ cats, function(x) c(mean = mean(x), st.dev = sd(x)), data = data)

#  cats  V2.mean V2.st.dev
#1    a 4.666667  2.081666
#2    b 4.352941  2.343640
#3    c 4.030303  1.828333
#4    d 3.838710  1.714580
#5    e 4.000000  3.082207
#6    f 5.000000  2.645751
person Joe    schedule 18.12.2018