4

平均値と SD を示すデータがあります。

#info mean sd
info1 20.84 4.56
info2 29.18 5.41
info3 38.90 6.22

実はこれは100行以上あります。上記のデータが与えられた場合、 1 つの図の各線の正規分布をプロットするにはどうすればよいですか?

4

2 に答える 2

8

Nが実際にどれだけ大きくなるかに応じて、これを複数のグラフのセットに分割することをお勧めします。しかし、これが基本的なアプローチです。まず、平均値と標準偏差に従ってランダムなデータを生成する必要があります。私は1000のランダムなポイントを選びました、あなたは必要に応じて調整することができます。次に、適切な次元で空白のプロットを設定し、とを使用linesdensityてデータを追加します。各データポイントの線種を指定するための優れた方法を提供するため、forループを使用しました。最後に、最後に凡例を追加します。

dat <- read.table(text = "info mean sd
info1 20.84 4.56
info2 29.18 5.41
info3 38.90 6.22
", header = TRUE)

densities <- apply(dat[, -1], 1, function(x) rnorm(n = 1000, mean = x[1], sd = x[2]))
colnames(densities) <- dat$info

plot(0, type = "n", xlim = c(min(densities), max(densities)), ylim = c(0, .2))
for (d in 1:ncol(densities)){
  lines(density(densities[, d]), lty = d)
}
legend("topright", legend=colnames(densities), lty=1:ncol(densities))

ここに画像の説明を入力してください

または、多くの利点があるggplot2を使用します。つまり、適切なxlimとylimの値を自動的に指定し、大騒ぎせずに凡例を使って賢明なことを行います。

library(reshape2)
library(ggplot2)
#Put into long format
densities.m <- melt(densities)
#Plot
ggplot(densities.m, aes(value, linetype = Var2)) + geom_density()

ここに画像の説明を入力してください

于 2012-04-27T02:01:07.223 に答える
6

ここでも 1 ドル不足し、1 日遅れています。チェイスは非常に徹底的な対応をしています。これが私のクラックです:

dat <- read.table(text="info  mean  sd
info1 20.84 4.56
info2 29.18 5.41
info3 38.90 6.22", header=T)

dat <- transform(dat, lower= mean-3*sd, upper= mean+3*sd)

plot(x=c(min(dat$lower)-2, max(dat$upper)+2), y=c(0, .25), ylab="", 
    xlim=c(min(dat$lower)-2, max(dat$upper)+2), xlab="", 
    axes=FALSE, xaxs = "i", type="n")
box()

FUN <- function(rownum) {
    par(new=TRUE)
    curve(dnorm(x,dat[rownum, 2], dat[rownum, 3]),
        xlim=c(c(min(dat$lower)-2, max(dat$upper)+2)), 
        ylim=c(0, .22),
        ylab="", xlab="")
}

lapply(seq_len(nrow(dat)), function(i) FUN(i))

ここに画像の説明を入力

于 2012-04-27T02:11:25.177 に答える