Вычисление квантилей с использованием плана выборки (пакет Survey)

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

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

# Load Data
  data(api)


# Convert data to data.table format (mostly to increase speed of the process)
  apiclus1 <- as.data.table(apiclus1)

# Create deciles variable
apiclus1[, decile:=cut(api00,
                       breaks=quantile(api00,
                                       probs=seq(0, 1, by=0.1), na.rm=T),
                       include.lowest= TRUE, labels=1:10)]

Я пробовал использовать svyquantile из пакета survey, но не мог разобраться в этой проблеме. Этот код не возвращает группы квантилей в качестве вывода, который я могу передать в новую переменную. Есть мысли по этому поводу?

# Load Package
 library(survey)

# create survey design
 dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

# What I've tried to do
  svyquantile(~api00, design = dclus1, quantiles = seq(0, 1, by=0.1), method = "linear", ties="rounded")

person rafa.pereira    schedule 23.08.2015    source источник


Ответы (2)


Результат всего вашего кода выше:

        0   0.1   0.2   0.3   0.4    0.5   0.6    0.7   0.8   0.9   1
api00 411 497.8 535.6 573.2 614.6 651.75 686.6 709.55 735.4 780.7 905

Вы можете изменить имена, чтобы представить свои группы. 0 и 1 представляют минимум и максимум. 0,1 представляет дециль 1, 0,2 - дециль 2 и т. Д. Примерно так:

dt_quantile = svyquantile(~api00, design = dclus1, quantiles = seq(0, 1, by=0.1), method = "linear", ties="rounded")
dt_quantile = data.table(dt_quantile)

setnames(dt_quantile, c("min",paste0("decile",1:10)))

dt_quantile = data.table(t(dt_quantile), keep.rownames = T)

dt_quantile 

#         rn     V1
# 1:      min 411.00
# 2:  decile1 497.80
# 3:  decile2 535.60
# 4:  decile3 573.20
# 5:  decile4 614.60
# 6:  decile5 651.75
# 7:  decile6 686.60
# 8:  decile7 709.55
# 9:  decile8 735.40
# 10: decile9 780.70
# 11: decile10 905.00

Я упустил вашу цель?

person AntoniosK    schedule 23.08.2015
comment
Спасибо @AntoniosK, но на самом деле идея состоит в том, чтобы создать во фрейме данных новую переменную, которая указывает, в какую группу квантилей попадает каждое наблюдение. - person rafa.pereira; 24.08.2015
comment
Ты прав. Я думаю, он просто вычисляет квантили, не объединяя информацию о том, к какому квантилю принадлежит каждая строка. Для этого предназначена функция. Однако у вас есть информация внутри переменных dclus1 $, которые вы можете использовать в качестве набора данных и применить свой метод. - person AntoniosK; 24.08.2015

person    schedule
comment
Спасибо @Anthony. Есть идеи, как это сделать по подгруппам? Для первой части извлечения квантилей я думал использовать это b <- svyby(~api00, ~stype, design = dclus1, svyquantile, quantiles = seq(0, 1, by=0.1), method = "linear", ties="rounded", na.rm= T, ci=TRUE) Но, признаюсь, я понятия не имею, как использовать этот объект b для обновления значений в плане опроса или в самом наборе данных - person rafa.pereira; 05.09.2015
comment
@RafaelPereira некрасивый, но вполне возможный ... обратите внимание, что 2:11 жестко запрограммирован. посмотрите data.frame(b), чтобы узнать, почему эти столбцы были выбраны для этого конкретного примера - person Anthony Damico; 05.09.2015
comment
в вашем коде для вычисления децилей по группам, почему вы написали seq(0, 0.9 , by=0.1) вместо seq(0, 10 , by=0.1)? - person rafa.pereira; 13.01.2017