J'ai une ligne de meilleur ajustement. J'ai besoin de points de données qui ne changeront pas ma ligne de meilleur ajustement

15

Je fais une présentation sur l'ajustement des lignes. J'ai une fonction linéaire simple, . J'essaie d'obtenir des points de données dispersées que je peux mettre dans un nuage de points qui maintiendra ma ligne de meilleur ajustement dans la même équation.y=1x+b

Je serais ravi d'apprendre cette technique dans R ou Excel - selon ce qui est plus facile.

Ryan Chase
la source
1
Le cas de régression multiple avec n'importe quel ensemble de coefficients (dont le vôtre est un cas spécial) est discuté au point (2) de cette réponse . En suivant les étapes, le cas de régression simple est résolu. L'approche fonctionne dans à peu près n'importe quel package où vous pouvez simuler des valeurs aléatoires de la distribution souhaitée et ajuster des modèles de régression.
Glen_b -Reinstate Monica
autodeskresearch.com/publications/samestats en présente une belle généralisation: le recuit simulé est utilisé pour créer des diagrammes de dispersion qui ont non seulement les valeurs souhaitées de statistiques récapitulatives, mais ils ont également une forme déterminée (comme le "dataurus"). Il s'agit d'un travail de Justin Matejka et George Fitzmaurice intitulé Same Stats, Different Graphs: Generating Datasets with Varied Aspect et des Statistiques Identiques par Simulated Annealing .
whuber

Réponses:

28

Choisissez n'importe quel (xi) condition qu'au moins deux d'entre eux diffèrent. Définir une ordonnée à l'origine β0 et une pente β1 et définir

y0i=β0+β1xi.

Cet ajustement est parfait. Sans modifier l'ajustement, vous pouvez modifier y0 en y=y0+ε en y ajoutant tout vecteur d'erreur ε=(εi) à condition qu'il soit orthogonal à la fois au vecteur x=(xi) et au vecteur constant (1,1,,1) . Un moyen facile d'obtenir une telle erreur est de choisir n'importe quel vecteur e et de laisser ε les résidus lors de la régression de econtre x . Dans le code ci-dessous, e est généré comme un ensemble de valeurs normales aléatoires indépendantes avec une moyenne de 0 et un écart-type commun.

De plus, vous pouvez même présélectionner la quantité de dispersion, peut - être en précisant ce que R2 devrait être. En laissant τ2=var(yi)=β12var(xi) , redimensionnez ces résidus pour avoir une variance de

σ2=τ2(1/R21).

Cette méthode est entièrement générale: tous les exemples possibles (pour un ensemble donné de xi ) peuvent être créés de cette façon.


Exemples

Quatuor d'Anscombe

Nous pouvons facilement reproduire le Quatuor d' Anscombe de quatre ensembles de données bivariés qualitativement distincts ayant les mêmes statistiques descriptives (par le second ordre).

Figure

Le code est remarquablement simple et flexible.

set.seed(17)
rho <- 0.816                                             # Common correlation coefficient
x.0 <- 4:14
peak <- 10
n <- length(x.0)

# -- Describe a collection of datasets.
x <- list(x.0, x.0, x.0, c(rep(8, n-1), 19))             # x-values
e <- list(rnorm(n), -(x.0-peak)^2, 1:n==peak, rnorm(n))  # residual patterns
f <- function(x) 3 + x/2                                 # Common regression line

par(mfrow=c(2,2))
xlim <- range(as.vector(x))
ylim <- f(xlim + c(-2,2))
s <- sapply(1:4, function(i) {
  # -- Create data.
  y <- f(x[[i]])                                         # Model values
  sigma <- sqrt(var(y) * (1 / rho^2 - 1))                # Conditional S.D.
  y <- y + sigma * scale(residuals(lm(e[[i]] ~ x[[i]]))) # Observed values

  # -- Plot them and their OLS fit.
  plot(x[[i]], y, xlim=xlim, ylim=ylim, pch=16, col="Orange", xlab="x")
  abline(lm(y ~ x[[i]]), col="Blue")

  # -- Return some regression statistics.
  c(mean(x[[i]]), var(x[[i]]), mean(y), var(y), cor(x[[i]], y), coef(lm(y ~ x[[i]])))
})
# -- Tabulate the regression statistics from all the datasets.
rownames(s) <- c("Mean x", "Var x", "Mean y", "Var y", "Cor(x,y)", "Intercept", "Slope")
t(s)

La sortie donne les statistiques descriptives du second ordre pour les données (x,y) pour chaque ensemble de données. Les quatre lignes sont identiques. Vous pouvez facilement créer plus d'exemples en modifiant x(les coordonnées x) et e(les modèles d'erreur) au début.

Des simulations

Ryβ=(β0,β1)R20R21x

simulate <- function(x, beta, r.2) {
  sigma <- sqrt(var(x) * beta[2]^2 * (1/r.2 - 1))
  e <- residuals(lm(rnorm(length(x)) ~ x))
  return (y.0 <- beta[1] + beta[2]*x + sigma * scale(e))
}

(Il ne serait pas difficile de porter cela sur Excel - mais c'est un peu douloureux.)

(x,y)60 xβ=(1,1/2)11/2R2=0.5

Figure

n <- 60
beta <- c(1,-1/2)
r.2 <- 0.5   # Between 0 and 1

set.seed(17)
x <- rnorm(n)

par(mfrow=c(1,4))
invisible(replicate(4, {
  y <- simulate(x, beta, r.2)
  fit <- lm(y ~ x)
  plot(x, y)
  abline(fit, lwd=2, col="Red")
}))

summary(fit)R2xi

whuber
la source
1
Très gentil merci! Malheureusement, votre approche ne semble pas être immédiatement applicable à cette question: des ensembles de données de type Anscombe avec la même boîte et le tracé des moustaches (moyenne / std / médiane / MAD / min / max) , n'est-ce pas?
Stephan Kolassa
@Stephan Vous avez raison, ce n'est pas le cas, car c'est un problème très non linéaire. Il peut être résolu de manière similaire - essentiellement en trouvant des solutions réalisables à un problème d'optimisation contraint - mais nécessite une routine d'optimisation différente et les solutions ne sont pas garanties.
whuber