2014-11-10 4 views
2

У меня есть набор данных следующей структуры:R-график условного распределения. cdplot(), кажется, не делают это

> data("household", package="HSAUR2") 
> household[c(1,5,10,30,40),] 
    housing food goods service gender total 
1  820 114 183  154 female 1271 
5  721 83 176  104 female 1084 
10  845 64 1935  414 female 3258 
30 1641 440 6471 2063 male 10615 
40 1524 964 1739 1410 male 5637 

В колонке «Общее» является суммой первых четырех столбцов. Это расходы домохозяйства, сгруппированные по четырем категориям.

Теперь, если я хотел условную плотность участок пола против общих расходов, я могу пойти:

cdplot(gender ~ total, data=household) 

И получите это изображение:

enter image description here

Я подобно той же картине с «полными» расходами по оси х, но условное распределение по четырем классам (жилье, продукты питания, товары, услуги) по оси у. Я могу думать только о очень грязном хаке, где я генерирую фактор, и для первой строки данных я повторяю «корпус» 820 раз, затем «питание» 114 раз и т. Д.

Должно быть проще, не так ли?

+0

Ваши другие переменные (жилье, продукты питания, товары, услуги) не являются категоричными (как пол), поэтому я не вижу, как можно создать такой сюжет, который вам кажется нужным. – Thomas

+0

Идея состоит в том, что переменная «total» разделяется на четыре категории. В зависимости от общих расходов домашних хозяйств (ось х) четыре процента различаются. Например, я ожидал бы, что доля денег, потраченных на жилье, уменьшается с увеличением общих расходов. Имею ли я смысл? В моей голове этот сюжет существует и работает, я просто не знаю, как его создать. –

ответ

3

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

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

# setup the data 
data("household", package = "HSAUR2") 
household$total <- rowSums(household[,1:4]) 
household <- within(household, { 
    housing <- housing/total 
    food <- food/total 
    goods <- goods/total 
    service <- service/total 
}) 

# estimate loess curves 
l_list <- 
list(loess(housing ~ total, data = household), 
    loess(food ~ total, data = household), 
    loess(goods ~ total, data = household), 
    loess(service ~ total, data = household)) 

# stack fitted curves on top of one another 
ndat <- data.frame(total = seq(min(household$total), max(household$total), 100)) 
p <- lapply(l_list, predict, newdata = ndat) 
for(i in 2:length(l_list)) 
    p[[i]] <- p[[i]] + p[[i-1]] 

# plot 
plot(NA, xlim=range(household$total), ylim = c(0,1), xlab='Total', ylab='Percent', las=1, xaxs='i') 
# plot dots 
with(household, points(total, housing, pch = 20, col = palette()[1])) 
with(household, points(total, housing + food, pch = 20, col = palette()[2])) 
with(household, points(total, housing + food + goods, pch = 20, col = palette()[3])) 
with(household, points(total, housing + food + goods + service, pch = 20, col = palette()[4])) 
# plot fitted lines 
for(i in 1:length(p)) 
    lines(ndat$total, p[[i]], type = 'l', lwd = 2, col = palette()[i]) 

Результат:

enter image description here

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

plot(NA, xlim=range(household$total), ylim = c(0,1), xlab='Total', ylab='Percent', las=1, xaxs='i') 
with(household, lines(total[order(total)], housing[order(total)], pch = 20, col = palette()[1])) 
with(household, lines(total[order(total)], (housing + food)[order(total)], pch = 20, col = palette()[2])) 
with(household, lines(total[order(total)], (housing + food + goods)[order(total)], pch = 20, col = palette()[3])) 
with(household, lines(total[order(total)], (housing + food + goods + service)[order(total)], pch = 20, col = palette()[4])) 

Результат:

enter image description here