我正在尝试用R.重新创建以下图.Minitab将其描述为正态概率图。
probplot可以帮助你完成大部分工作。不幸的是,我无法弄清楚如何在这个情节周围添加置信区间带。
同样,ggplot的stat_qq()似乎与转换的x轴呈现相似的信息。似乎geom_smooth()
可能是添加乐队的候选者,但我还没弄明白。
最后,Getting Genetics Done的人描述了类似的here.
重新绘制上图的示例数据:
x <- c(40.2, 43.1, 45.5, 44.5, 39.5, 38.5, 40.2, 41.0, 41.6, 43.1, 44.9, 42.8)
如果有人有基本图形或ggplot的解决方案,我会很感激!
修改
在查看probplot
的详细信息之后,我确定了它是如何在图表上生成拟合线的:
> xl <- quantile(x, c(0.25, 0.75))
> yl <- qnorm(c(0.25, 0.75))
> slope <- diff(yl)/diff(xl)
> int <- yl[1] - slope * xl[1]
> slope
75%
0.4151
> int
75%
-17.36
事实上,将这些结果与你从probplot对象中得到的结果进行比较似乎比较得好:
> check <- probplot(x)
> str(check)
List of 3
$ qdist:function (p)
$ int : Named num -17.4
..- attr(*, "names")= chr "75%"
$ slope: Named num 0.415
..- attr(*, "names")= chr "75%"
- attr(*, "class")= chr "probplot"
>
但是,将此信息合并到ggplot2或基本图形中不会产生相同的结果。
probplot(x)
对战:
ggplot(data = df, aes(x = x, y = y)) + geom_point() + geom_abline(intercept = int, slope = slope)
我使用R的基本图形得到了类似的结果
plot(df$x, df$y)
abline(int, slope, col = "red")
最后,我了解到图例的最后两行是指正常性的Anderson-Darling测试,可以使用nortest
包重现。
> ad.test(x)
Anderson-Darling normality test
data: x
A = 0.2303, p-value = 0.7502
答案 0 :(得分:2)
也许这将是你可以建立的东西。默认情况下,stat_smooth()使用level = 0.95。
df <- data.frame(sort(x), ppoints(x))
colnames(df) <- c("x","y")
ggplot(df, aes(x,y)) +
geom_point() +
stat_smooth() +
scale_y_continuous(limits=c(0,1),breaks=seq(from=0.05,to=1,by=0.05), formatter="percent")
答案 1 :(得分:2)
尝试qqPlot
包中的QTLRel
功能。
require("QTLRel")
qqPlot(rnorm(100))
答案 2 :(得分:1)
您使用的是不正确的“y”,它们应该是分位数(标有概率)。以下显示了正确位置的行:
df<-data.frame(x=sort(x),y=qnorm(ppoints(length(x))))
probs <- c(0.01, 0.05, seq(0.1, 0.9, by = 0.1), 0.95, 0.99)
qprobs<-qnorm(probs)
xl <- quantile(x, c(0.25, 0.75))
yl <- qnorm(c(0.25, 0.75))
slope <- diff(yl)/diff(xl)
int <- yl[1] - slope * xl[1]
ggplot(data = df, aes(x = x, y = y)) + geom_point() + geom_abline(intercept = int,slope = slope)+scale_y_continuous(limits=range(qprobs), breaks=qprobs, labels = 100*probs)+labs(y ="Percent" , x="Data")
在Minitab中添加置信区间,您可以执行以下操作
fd<-fitdistr(x, "normal") #Maximum-likelihood Fitting of Univariate Dist from MASS
xp_hat<-fd$estimate[1]+qprobs*fd$estimate[2] #estimated perc. for the fitted normal
v_xp_hat<- fd$sd[1]^2+qprobs^2*fd$sd[2]^2+2*qprobs*fd$vcov[1,2] #var. of estimated perc
xpl<-xp_hat + qnorm(0.025)*sqrt(v_xp_hat) #lower bound
xpu<-xp_hat + qnorm(0.975)*sqrt(v_xp_hat) #upper bound
df.bound<-data.frame(xp=xp_hat,xpl=xpl, xpu = xpu,nquant=qprobs)
并从上面向你的ggplot添加以下两行(另外,用估计的百分位替换斜率和截距线方法)
geom_line(data=df.bound,aes(x = xp, y = qprobs))+
geom_line(data=df.bound,aes(x = xpl, y = qprobs))+
geom_line(data=df.bound,aes(x = xpu, y = qprobs))
答案 3 :(得分:1)