Создание кривой для соответствия данным x-y, где X является категориальным

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

В моем наборе данных 184 наблюдения 14 переменных:

      tagID    ddmmyy Hour.GMT.Hour.Local.  X0   X3   X10   X20   X50    X100   X150  X200  X300  X400
1     122097   250912     0            9   0.0  0.0   0.3  12.0   15.3   59.6   12.8  0.0    0    0
2     122097   260912     0            9   0.0  2.4   6.9  5.5    13.7   66.5   5.0   0.0    0    0
3     122097   260912     6            15  0.0  1.9   3.6  4.1    12.7   39.3   34.6  3.8    0    0
4     122097   260912     12           21  0.0  0.2   5.5  8.0    18.1   61.4   6.7   0.0    0    0
5     122097   280912     6            15  2.4  9.3   6.0  3.4    7.6    21.1   50.3  0.0    0    0
6     122097   290912     18           3   0.0  0.2   1.6  6.4    41.4   50.4   0.0   0.0    0    0

Меня интересуют переменные X0:X400. Это интервалы глубины, и значения представляют собой процент от общего времени в течение этого периода дня, которое животное провело в этом интервале глубин. Итак, в первой строке он провел 0% своего времени между 0–3 метрами, 59,6% своего времени между 100–150 метрами и т. Д. С небольшой помощью некоторых ответов на мой последний вопрос здесь, о stackoverflow, я вычислил средний% времени, проведенного этим животным в каждой глубинной ячейке:

diving.means <- colMeans(diving[, -(1:4)])
lowerIntervalBound <- gsub("X", "", names(diving)[-(1:4)])
lowInts <- as.numeric(lowerIntervalBound)
plot(x=factor(lowInts), y=diving.means, xlab="Depth Bin (Meters—Lower Bound)", ylab="% Time Spent")

который предоставил мне этот сюжет:

введите описание изображения здесь

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

Теперь у меня есть несколько животных и разные временные шкафы, которые я хотел бы сравнить. В конечном итоге я разработаю систему взвешивания времени, проведенного в ячейках, чтобы получить среднюю глубину для статистического сравнения, но сейчас я просто хочу сравнить их визуально, качественно, а также создать графики, которые я могу использовать в презентациях и, в конечном итоге, публикации. Я бы хотел создать кривую плотности, представляющую мою «гистограмму», а затем построить эти кривые из нескольких сценариев на одном графике для сравнения. Однако я не могу заставить эту работу работать с функцией density(), так как у меня нет данных о частоте. У меня вроде уже есть рассчитанные плотности как% времени, проведенного в каждом бункере ... но они не представлены в исходном формате в моем наборе данных как частоты категорий, из которых я могу затем сделать гистограммы и кривые плотности.

Вот как выглядят мои данные:

> diving.means
          X0           X3          X10          X20          X50         X100         X300         X400           X150         X200 
 3.330978261  3.299456522  8.857608696 17.646195652 30.261413043 29.356521739  6.445108696  0.664130435    0.135869565  0.001630435 

or:

> df<-data.frame(lowInts, diving.means)
> df
 lowInts diving.means
X0         0  3.330978261
X3         3  3.299456522
X10       10  8.857608696
X20       20 17.646195652
X50       50 30.261413043
X100     100 29.356521739
X150     150  6.445108696
X200     200  0.664130435
X300     300  0.135869565
X400     400  0.001630435

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

введите описание изображения здесь

а затем уметь изолировать кривые и построить их вместе.

Спасибо за любую помощь, которую вы можете оказать!


person stewart6    schedule 18.04.2013    source источник
comment
+1, чтобы помочь вам публиковать изображения :-)   -  person Nishanth    schedule 18.04.2013
comment
Спасибо! Это сработало :)   -  person stewart6    schedule 18.04.2013
comment
Похоже, вы хотите подогнать распределение к интервальным цензурированным данным. Вы можете попробовать что-то вроде fitdistcens из пакета fitdistrplus.   -  person dnlbrky    schedule 25.06.2013


Ответы (2)


У вас уже есть частоты, поэтому hist использовать нельзя. Вы можете использовать plot со сплайн-интерполяцией для плотности:

df <- read.table(text=" lowInts diving.means
X0         0  3.330978261
X3         3  3.299456522
X10       10  8.857608696
X20       20 17.646195652
X50       50 30.261413043
X100     100 29.356521739
X150     150  6.445108696
X200     200  0.664130435
X300     300  0.135869565
X400     400  0.001630435")

require(splines)
dens <-predict(interpSpline(df[,1], df[,2]))
plot(df[,1], df[,2], type="s", ylim=c(0,40))
lines(dens, col="red",lwd=2)

введите описание изображения здесь

person Nishanth    schedule 18.04.2013
comment
Это помогло, спасибо! Я использовал небольшую модификацию, чтобы сделать его немного лучше: dens ‹-predict (interpSpline (as.factor (df [, 1]), df [, 2])) plot (x = factor (df [, 1]) , df [, 2], type = s, ylim = c (0,40)) Я не был уверен, будет ли он работать с x в качестве фактора, но, конечно же ... - person stewart6; 18.04.2013

Я думаю, что вам нужна ступенчатая функция.

Вы можете использовать stepfun для создания этой функции.

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

# assuming your data is called `diving`
library(data.table)
DTlong <- reshape(data.table(diving), varying = list(5:14), direction = 'long', 
  times = c(0,3,10,20,50,100,150,200,300,400), 
  v.names = 'time.spent', timevar = 'hours')




DTsummary <- DTlong[,c(mean.d = mean(time.spent), 
          setattr(as.list(fivenum(time.spent)), 'names',c('min','lhinge','median','uhinge','max'))),
       by=list(hours, midhours, upperhours)]

Базовое веселье R

f.median <- DTsummary[, stepfun(hours, c(0,median))]
f.uhinge <- DTsummary[, stepfun(hours, c(0,uhinge))]
f.lhinge <- DTsummary[, stepfun(hours, c(0,lhinge))]


plot(f.median, main = 'median time spent', xlim = c(0,500), do.points = FALSE)

введите описание изображения здесь

используя ggplot2

ggplot(DTsummary, aes(x = hours)) + geom_step(aes(y = median))

введите описание изображения здесь

person mnel    schedule 18.04.2013