代码之家  ›  专栏  ›  技术社区  ›  Chase

重新创建Minitab正态概率图

  •  6
  • Chase  · 技术社区  · 14 年前

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

    probplot probplot 为您提供了最便捷的服务。不幸的是,我不知道如何在该图周围添加置信区间带。

    类似地,ggplot的 stat_qq() 似乎提供了具有转换X轴的类似信息。似乎 geom_smooth() 将是添加波段的可能人选,但我还没有想到这一点。

    最后,完成遗传学的人描述了类似的事情

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

    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的解决方案,我会很感激的!

    编辑

    在查看了proplot的详细信息之后,我确定了它是如何在图上生成拟合线的:

    >xl<-分位数(x,c(0.25,0.75))
    >yl<-qnorm(C(0.25,0.75))。
    >坡度<-diff(yl)/diff(xl)
    >int<-yl[1]-坡度*xl[1]
    斜率
    75%
    零点四一五一
    & int
    75%
    -1736
    < /代码> 
    
    

    实际上,将这些结果与ProbPlot对象得到的结果进行比较似乎非常好:

    >检查<-proplot(x)
    STR(检查)
    3名单
    $qdist:函数(p)
    $int:命名num-17.4
    ..-attr(*,“名称”)=chr“75%”
    $slope:命名num 0.415
    ..-attr(*,“名称”)=chr“75%”
    -attr(*,“class”)=chr“proplot”
    gt;
    < /代码> 
    
    

    但是,将此信息合并到ggplot2或基本图形中不会产生相同的结果。

    proplot(x)
    < /代码> 
    
    

    ggplot(data=df,aes(x=x,y=y))+geom_point()+geom_abline(intercept=int,slope=slope)
    < /代码> 
    
    

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

    绘图(df$x,df$y)
    abline(int,slope,col=“red”)。
    < /代码> 
    
    

    最后,我了解到,图例的最后两行是指Anderson Darling Test for Normality,可以使用nortest.package进行复制。

    广告测试(X) 安德森-达林正态性检验 数据:X A=0.2303,P值=0.7502 < /代码> <将其描述为正态概率图。

    alt text

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

    同样,ggplot的stat_qq()似乎呈现了类似的信息与转换的X轴。似乎geom_smooth()可能是加入乐队的候选人,但我还没弄清楚。

    最后,做遗传学实验的人描述了类似的事情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)
    

    alt text

    对比:

    ggplot(data = df, aes(x = x, y = y)) + geom_point() + geom_abline(intercept = int, slope = slope)
    

    alt text

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

    plot(df$x, df$y)
    abline(int, slope, col = "red")
    

    最后,我了解到,最后两行的传说是指安德森-达林测试的正常性,可以用nortest

    > ad.test(x)
    
        Anderson-Darling normality test
    
    data:  x 
    A = 0.2303, p-value = 0.7502
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Brandon Bertelsen    14 年前

    也许这是你可以建立的东西。默认情况下,stat_smooth()使用级别=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")
    
        2
  •  2
  •   Kevin Wright    12 年前

    尝试 qqplot qtlrel中的函数 qtlrel package.

    require(“qtlrel”)。
    QQplot(RNORM(100))。
    < /代码> 
    
    

    require("QTLRel")
    qqPlot(rnorm(100))
    

    enter image description here

        3
  •  1
  •   Julie B    13 年前

    您使用的是不正确的“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))
    
        4
  •  1
  •   N. Maks    6 年前

    我知道这是一个古老的问题,但对于仍在寻找解决方案的其他人,请查看 ggqqplot from the ggpubr package.

    库(ggpubr)
    ggqqplot(数据$sample)
    < /代码> 
    
    

    阿卡奇

    library(ggpubr)
    ggqqplot(data$sample)
    

    ggqqplot of sample data