2

最初我从 2 个向量(我的数据的子集)开始。我在两者上运行 ecdf,将它们绘制在同一个图中以便于比较。所有这一切都很好,但我需要知道的是如何使函数对任何一对向量都通用,所以我只需输入向量,函数就会工作。就像我第二次调用更大的向量一样,我希望绘图的轴自动缩放更大的向量,而不管调用的顺序如何,这样就不会丢失数据。

我已经包括了一个使用虹膜数据的设置,以防万一。

data=iris

virg<-subset(iris, iris$Species=="virginica"); virg
virg_pl<-virg$Petal.Length; virg_pl

versi<-subset(iris, iris$Species=="versicolor"); versi
versi_pl<-versi$Petal.Length; versi_pl

这是我所拥有的:

twoecdfsoner<-function(x,y,z){
       ecdf1<-ecdf(x)
       ecdf2<-ecdf(y)
    plot(ecdf1,xlab=head(z,n=1),
        ylab="cumulative relative frequency",
        lty=1,pch=".",
        main="",
        do.point=FALSE,
        verticals=TRUE,xlim=c(min (y),max (x)))

    plot(ecdf2,verticals=TRUE, 
        do.points=FALSE,
        lty=3,pch=".", 
        add=TRUE, xlim=c(min (y),max (x)))

    legend("right","center",
    legend=c(deparse(substitute(x)),
        deparse(substitute(y))),
        lty=c(1,3),cex=0.8)
    }
    twoecdfsoner(virg_pl,versi_pl,"inches")

好像我可以写一个条件语句,但我得到了这个错误:

Warning messages:
1: In x > y :
  longer object length is not a multiple of shorter object length
2: In x > y :
  longer object length is not a multiple of shorter object length
3: In x > y :
  longer object length is not a multiple of shorter object length

到目前为止我已经尝试过

xlim=c(min (y),max (x)))
xlim=range(c(x),c(y)
xlim=pmax(x,y)

并编写条件语句

我还想要实线来为那个更大的向量编码。如果有人有任何建议,将不胜感激。

@42- 在阅读了一下之后,我想我可以做一个条件语句,这似乎也有效。对以这种方式运行代码有任何批评吗?

twoecdfsoner<-function(x,y,z){
ecdf_1 <- plot(ecdf(x),
    verticals=TRUE,
    pch=".",
    main="",
    do.points=FALSE,
    lty=ifelse(max(x)>max(y), c(1), c(3)),
    xlab=head(z,n=1),
    ylab="Cumulative relative frequency", 
    xlim=range(x,y))

ecdf_2 <- lines(ecdf(y), 
    verticals=TRUE, 
    do.points=FALSE,
    lty=ifelse(max(y)>max(x), c(1), c(3)), 
    pch=".")

legend_text<-
if (max(x)>max(y)){
    legend=c(deparse(substitute(x)), deparse(substitute(y)))
} else {max(y)>max(x)
    legend=c(deparse(substitute(y)), deparse(substitute(x)))
}


legend("right",
    legend=legend_text,
    lty=c(1,3))
}

twoecdfsoner(virg_pl,versi_pl,"inches")
4

1 回答 1

1

ecdf 有问题……它在环境中隐藏了“x”参数。然后新手找不到它们。

> ecdf(versi$Petal.Length)
Empirical CDF 
Call: ecdf(versi$Petal.Length)
 x[1:19] =      3,    3.3,    3.5,  ...,      5,    5.1
> str(ecdf(versi$Petal.Length))
function (v)  
 - attr(*, "class")= chr [1:3] "ecdf" "stepfun" "function"
 - attr(*, "call")= language ecdf(versi$Petal.Length)

此时,运行帮助页面中的所有示例将是有益的:

?ecdf   # and probably also look at ?stepfun

请注意,结果是 a function,因此尝试派生 amin和/或max不带参数总是会失败。一旦您确实找到了如何访问 ecdf 的环境(见下文),那么您可能需要两个向量的连接值的最小值,而不是假设一个具有最小值而另一个具有最大值。以下是 ecdf 函数环境中的内容:

ls( environment(ecdf(versi_pl)) )
[1] "f"      "method" "nobs"   "x"      "y"      "yleft"  "yright"

 twoecdfsoner<-function(x,y,z){
       ecdf1<-ecdf(x);
       x1 <- environment(ecdf1)$x
       ecdf2<-ecdf(y); 
       x2 <- environment(ecdf2)$x
    plot(ecdf1,xlab=head(z,n=1),
        ylab="cumulative relative frequency",
        lty=1,pch=".",
        main="",
        do.point=FALSE,
        verticals=TRUE,xlim=c( min ( c(x1,x2) ),max ( c(x1,x2)) ) )

    plot(ecdf2,verticals=TRUE, 
        do.points=FALSE,
        lty=3,pch=".", 
        add=TRUE, xlim=c( min ( c(x1,x2) ), max ( c(x1,x2) )) ) 

    legend("right","center",
    legend=c(deparse(substitute(x)),
        deparse(substitute(y))),
        lty=c(1,3),cex=0.8)
    }
    twoecdfsoner(versi_pl, virg_pl,"inches")
于 2017-10-07T21:49:53.930 回答