0

我正在使用 R 为具有拟合正态分布线的患病和健康个体创建大小频率直方图。我有 2 个问题正在寻求建议。

  1. 如何从聚合数据创建直方图?下面的示例表汇总了每种尺寸内患病和健康个体的数量。

输入(数据)

'structure(list(Size = c(25L, 28L, 31L, 45L, 60L), diseased = c(0L, 
22L, 10L, 5L, 2L), healthy = c(55L, 40L, 15L, 7L, 2L)), .Names = c("Size", 
"diseased", "healthy"), class = "data.frame", row.names = c(NA, 
-5L))'

2.如何将两个直方图叠加到一个带有拟合正态分布线的图形中。

我已经为聚合数据 ggplot(data,aes(x=Size,y=diseased))+geom_bar(stat='identity') 尝试了以下代码,效果很好,但我不知道如何添加直方图对于健康的人。

我还尝试使用以下文本将汇总数据(称为“数据”)恢复为原始原始格式: raw <- data[rep(1:data, times=data$diseased), "Size", drop=FALSE ]

我收到以下错误消息:rep(1:data, times=data$diseased) 中的错误:'times' 参数无效。从之前的评论来看,rep 函数似乎无法处理“0”

4

1 回答 1

0

所以,我很着急,我把正常曲线拼凑在一起,但你可以用它来绘制两个“直方图风格”的图。

当然,如果我们拥有完整的数据集而不仅仅是摘要,那么获得曲线会更容易。我有点捏造了它们,但我认为这足以在这里得到大致的想法。

我不完全清楚你为什么要这样做,但你可以......

library(SDMTools) # Use this to get weighted means

testdata <- structure(list(Size=c(25L, 28L, 31L, 45L, 60L),
                           diseased=c(0L, 22L, 10L, 5L, 2L),
                           healthy=c(55L, 40L, 15L, 7L, 2L)),
                      .Names = c("Size", "diseased", "healthy"),
                      class = "data.frame",
                      row.names = c(NA, -5L))

barplot(testdata$healthy,
        names.arg=paste("                 ",testdata$Size),
        col="light blue",
        border="blue",
        xlim=c(0,6),
        ylim=c(0,70),
        width=0.5,
        space=1)
par(new=TRUE)
barplot(testdata$diseased,
        col="pink",
        border="red",
        xlim=c(0,6),
        ylim=c(0,70),
        width=0.5,
        space=c(2,1,1,1,1))

healthy_mean <- wt.mean(x=testdata$healthy,wt=testdata$Size)
healthy_sd <- wt.sd(x=testdata$healthy,wt=testdata$Size)
diseased_mean <- wt.mean(x=testdata$diseased,wt=testdata$Size)
diseased_sd <- wt.sd(x=testdata$diseased,wt=testdata$Size)

yfit_healthy <- as.data.frame(dnorm(0:max(testdata$healthy),
                              mean=healthy_mean,sd=healthy_sd))
names(yfit_healthy) <- "y"
yfit_diseased <- as.data.frame(dnorm(0:max(testdata$diseased),
                               mean=diseased_mean,sd=diseased_sd))
names(yfit_diseased) <- "y"

yfit_healthy$x <- seq(0,6,length.out=length(yfit_healthy$y))
yfit_diseased$x <- seq(0,6,length.out=length(yfit_diseased$y))

lines(yfit_healthy$x,
      (max(testdata$healthy)*yfit_healthy$y)/max(yfit_healthy$y),
      col="blue",lwd=2)

lines(yfit_diseased$x,
      (max(testdata$diseased)*yfit_diseased$y)/max(yfit_diseased$y),
      col="red",lwd=2)

这段代码让我:

不完全是我最好的图表

于 2013-02-25T22:20:29.783 回答