首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重建minitab正态概率图

重建minitab正态概率图
EN

Stack Overflow用户
提问于 2010-10-14 02:21:55
回答 5查看 7K关注 0票数 6

我试图用R. Minitab重新创建下面的情节,将其描述为一个正常的概率图。

概率图把你带到那里的大部分时间。不幸的是,我不知道如何在这个图周围添加置信区间带。

类似地,ggplot的qq()似乎用转换后的x轴表示类似的信息。似乎geom_smooth()将是可能的候选加入乐队,但我还没有弄清楚。

最后,“让遗传学完成”的人描述了类似的这里。

重新创建上面的绘图的示例数据:

代码语言:javascript
复制
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)

如果有人有一个基本图形或图形的解决方案,我会很感激的!

编辑

在查看了probplot的详细信息之后,我确定了它是如何在图形上生成fit行的:

代码语言:javascript
复制
> 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 

实际上,将这些结果与从概率对象中获得的结果进行比较似乎是非常好的:

代码语言:javascript
复制
> 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或基本图形中并不会产生相同的结果。

代码语言:javascript
复制
probplot(x)

相对于:

代码语言:javascript
复制
ggplot(data = df, aes(x = x, y = y)) + geom_point() + geom_abline(intercept = int, slope = slope)

我用R的基本图形得到了类似的结果

代码语言:javascript
复制
plot(df$x, df$y)
abline(int, slope, col = "red")

最后,我了解到,传说的最后两行提到了安德森-达林测试的正常度,并且可以用nortest包复制。

代码语言:javascript
复制
> ad.test(x)

    Anderson-Darling normality test

data:  x 
A = 0.2303, p-value = 0.7502
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-14 05:38:58

也许这将是你可以建立的东西。默认情况下,stat_smooth()使用level=0.95。

代码语言:javascript
复制
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")
票数 2
EN

Stack Overflow用户

发布于 2011-10-28 20:19:31

尝试qqPlot包中的QTLRel函数。

代码语言:javascript
复制
require("QTLRel")
qqPlot(rnorm(100))

票数 3
EN

Stack Overflow用户

发布于 2012-02-09 17:15:55

如果使用的是不正确的"y",它们应该是分位数(用概率标记)。下面显示了正确位置上的行:

代码语言:javascript
复制
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中那样添加信任边界,可以执行以下操作

代码语言:javascript
复制
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中(另外,用估计的百分位数替换斜率和截取线)

代码语言:javascript
复制
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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3929611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档