3

我有一个来自标记动物的潜水行为数据集,我正在努力为数据拟合曲线,我认为主要是因为在这种情况下 X 变量是分类的,而不是连续的数据。让我介绍一下背景:

我的数据集有 14 个变量的 184 个观察值:

      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-3 米之间花费了 0% 的时间,在 100-150 米之间花费了 59.6% 的时间,等等。在我最后一个问题的一些答案的帮助下,我计算了该动物在每个深度箱中花费的平均时间百分比:

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 

或者:

> 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

我想要制作的东西看起来或多或少是这样的(从出版物中随机抽取——轴与我的数据无关):

在此处输入图像描述

然后能够隔离曲线并将它们绘制在一起。

感谢您的任何帮助,您可以提供!

4

2 回答 2

1

你已经有频率,所以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)

在此处输入图像描述

于 2013-04-18T06:13:11.837 回答
1

我认为你想要一个阶梯函数。

您可以使用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))

在此处输入图像描述

于 2013-04-18T05:37:08.953 回答