Fonction de répartition empirique bivariée

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Florent Diaz
Messages : 16
Enregistré le : 06 Avr 2016, 15:09

Fonction de répartition empirique bivariée

Messagepar Florent Diaz » 27 Avr 2016, 14:50

Bonjour à tous,

Tout est quasiment dans le titre !
Je souhaiterais réaliser une fonction de répartition empirique bivariée mais je n'y arrive pas.
Je sais que dans le cas univarié on peut utiliser la fonction ecdf et je pensais trouver une fonction du même genre.
J'avais trouvé la fonction mecdf (package du même nom) pour traiter le cas multivarié. Mais le package n'est plus d'actualité pour la version courante de R. Je suis quand même arrivé à récupérer la fonction en question que je vous mets en code.

Mais lorsque je la lance sur mes données, différentes erreurs se produisent; notamment "Error in sort(v) : l'argument "v" est manquant, avec aucune valeur par défaut".
Or je ne trouve nul part de v dans la fonction.. (après je suis peut être fatigué !).

Si jamais vous avez des pistes pour arriver à faire cette FdR je suis preneur !

Merci d'avance !

Code : Tout sélectionner

mecdf = function (x, continuous=FALSE, ...,
                  validate=TRUE, expand=continuous, project=FALSE, expandf=0.1)
{ x = cbind (x)
  nraw = nr = nrow (x)
  nc = ncol (x)
  if (validate)
  {   if (length (list (...) ) > 0)
    stop ("invalid constructor argument")
    if (!is.numeric (x) ) stop ("x must be numeric")
    if (!all (is.finite (x) ) ) stop ("all x must be finite")
    for (j in 1:nc) if (length (unique (x [,j]) ) < 2)
      stop ("each variable requires at least 2 distinct realisations")
    if (nc == 1) x [] = sort (x)
    if (is.null (colnames (x) ) ) colnames (x) = paste ("x", 1:ncol (x), sep="")
    if (is.null (rownames (x) ) ) rownames (x) = 1:nr
  }
  if (expand)
  {   nr = nr + 2
      a = b = numeric (nc)
      for (j in 1:nc)
      {   xrng = range (x [,j])
          xf = expandf * diff (xrng)
          a [j] = xrng [1] - xf
          b [j] = xrng [2] + xf
      }
      x = rbind (a, x, b)
  }
  if (project)
    for (j in 1:nc) x [,j] = (order (order (x [,j]) ) - 1) / (nr - 1)
  Fh = Fst = NULL
  if (nc > 1)
  {   if (continuous)
  {   Fh = .mecdf.continuous
      Fst = .mecdf.vertex
  }
  else Fh = function (.mecdf.step)
  }
  else
  {   if (continuous) Fh = .uecdf.continuous
      else Fh =.uecdf.step
  }
  extend (function (.mecdf.main), "mecdf", continuous, Fh, Fst, nraw, nr, nc, x)
}

.mecdf.main = function (u)
{ if (.$nc > 1)
{   if (!is.matrix (u) ) u = rbind (u)
    if (.$nc != ncol (u) )
      stop ("k-variate mecdf requires k-column matrix")
    .mecdf.interpolate (.$Fh, .$Fst, .$nr, .$nc, .$x, u)
}
else
{   if (is.matrix (u) && ncol (u) > 1)
  stop ("univariate mecdf doesn't accept multicolumn matrix")
  .uecdf.interpolate (.$Fh, .$nr, .$x, u)
}
}

print.mecdf = function (m, ...)
{ variate = if (m$nc == 1) "univariate"
  else if (m$nc == 2) "bivariate"
  else paste (m$nc, "-variate", sep="")
  type = if (m$continuous) "continuous" else "step"
  cat ("mecdf_{", variate, ", ", type, "}\n", sep="")
  print (samp (m$x) )
}

plot.mecdf = function (m, ...)
{ p = m (m$x)
  if (m$nc == 1) .uecdf.plot (m, p, m$continuous, ...)
  else if (m$nc == 2) .becdf.plot (m, p, ...)
  else stop ("s3x_plot.mecdf only supports univariate and bivariate models")
}

.uecdf.plot = function (e, p, continuous, ...)
{ xlab = colnames (e$x)
  ylab = "Fh(x)"
  if (continuous)
    plot (e$x, p, ylim=c (0, 1), yaxs="i", type="l", xlab=xlab, ylab=ylab, ...)
  else
  {   plot (e$x, p, ylim=c (0, 1), yaxs="i", xlab=xlab, ylab=ylab, pch=NA, ...)
      x1 = e$x [-e$nr]
      x2 = e$x [-1]
      p0 = p [-e$nr]
      segments (x1, p0, x2, p0)
      segments (e$x, c (0, p), e$x, c (p, 1) )
  }
}

.becdf.plot = function (e, p, lines=TRUE, lty=1, col=rgb (0.975, 0.7, 0), ...)
{ labs = colnames (e$x)
  x1 = e$x [,1]; x2 = e$x [,2]
  plot (x1, x2, xlab=labs [1], ylab=labs [2], pch=NA, ...)
  if (lines)
  {   segments (x1, x2, x1 - 2 * diff (range (x1) ), x2, lty=lty, col=col)
      segments (x1, x2, x1, x2 - 2 * diff (range (x2) ), lty=lty, col=col)
  }
  text (x1, x2, round (p, 2) )
}


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité