Ich habe eine Linie, die am besten passt. Ich benötige Datenpunkte, die meine Best-Fit-Linie nicht ändern

14

Ich halte einen Vortrag über das Anpassen von Linien. Ich habe eine einfache lineare Funktion, y=1x+b . Ich versuche, verstreute Datenpunkte zu erhalten, die ich in ein Streudiagramm einfügen kann, damit meine Best-Fit-Linie der gleichen Gleichung entspricht.

Ich würde diese Technik gerne in R oder Excel lernen - je nachdem, was einfacher ist.

Ryan Chase
quelle
1
Der Fall der multiplen Regression mit einer Reihe von Koeffizienten (von denen Ihre ein Sonderfall ist) wird in Punkt (2) dieser Antwort erörtert . Befolgen Sie die dort angegebenen Schritte, um den einfachen Regressionsfall zu lösen. Der Ansatz funktioniert in nahezu jedem Paket, in dem Sie zufällige Werte der gewünschten Verteilung simulieren und Regressionsmodelle anpassen können.
Glen_b
autodeskresearch.com/publications/samestats bietet eine schöne Verallgemeinerung davon: Simuliertes Tempern wird verwendet, um Streudiagramme zu erstellen, die nicht nur die gewünschten Werte für Zusammenfassungsstatistiken aufweisen, sondern auch eine bestimmte Form haben (wie z. B. den "Datasaurus"). Dies ist eine Arbeit von Justin Matejka und George Fitzmaurice mit dem Titel Same Stats, Different Graphs: Generieren von Datensätzen mit unterschiedlichem Erscheinungsbild und identischen Statistiken durch simuliertes Tempern .
whuber

Antworten:

28

Wähle ein beliebiges (xi) vorausgesetzt, mindestens zwei davon unterscheiden sich. Setze einen Schnittpunkt β0 und eine Steigung β1 und definiere

y0i=β0+β1xi.

Diese Passform ist perfekt. Ohne die Anpassung zu ändern, können Sie y0 zu y=y0+ε ändern, indem Sie einen beliebigen Fehlervektor ε=(εi) hinzufügen , sofern dieser sowohl zum Vektor x=(xi) als auch zum konstanten Vektor (1,1,,1)) orthogonal ist , 1 , , 1 ) . Eine einfache Möglichkeit , einen solchen Fehler zu erhalten , ist zu holen jeden Vektor e und lassen ε die Residuen auf Regression sein e gegen x . Im folgenden Code wird e als eine Menge unabhängiger zufälliger Normalwerte mit dem Mittelwert 0 und der gemeinsamen Standardabweichung generiert .

Darüber hinaus können Sie sogar die Menge der Streuung vorwählen, indem Sie möglicherweise festlegen, was R2 sein soll. Lassen Sie τ2=var(yi)=β12var(xi) , skalieren Sie diese Residuen neu, um eine Varianz von zu haben

σ2=τ2(1/R21).

Diese Methode ist ganz allgemein: alle möglichen Beispiele (für eine gegebene Menge von xi ) können auf diese Weise erstellt werden.


Beispiele

Anscombes Quartett

Wir können Anscombes Quartett aus vier qualitativ unterschiedlichen bivariaten Datensätzen mit derselben deskriptiven Statistik (durch die zweite Ordnung) leicht reproduzieren .

Figure

Der Code ist bemerkenswert einfach und flexibel.

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)

(x,y)x (die x-Koordinaten) unde zu Beginn (die Fehlermuster) .

Simulationen

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))
}

(Es wäre nicht schwierig, dies nach Excel zu portieren - aber es ist ein wenig schmerzhaft.)

(x,y)60 xβ=(1,-1/2)( dh abfangen1 und Steigung -1/2), und R2=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")
}))

Durch Ausführen von können summary(fit)Sie überprüfen, ob die geschätzten Koeffizienten genau wie angegeben und das Vielfache sindR2ist der beabsichtigte Wert. Andere Statistiken, wie der Regressions-p-Wert, können durch Ändern der Werte von angepasst werdenxich.

whuber
quelle
Sehr schön danke! Leider scheint Ihr Ansatz auf diese Frage nicht sofort anwendbar zu sein: Anscombe-ähnliche Datensätze mit demselben Box- und Whisker-Plot (Mittelwert / Standard / Median / Mad / Min / Max) , oder?
S. Kolassa - Wiedereinsetzung von Monica
@Stephan Du hast recht, dass es nicht so ist, denn das ist ein höchst nichtlineares Problem. Sie kann auf ähnliche Weise gelöst werden - im Wesentlichen durch Finden praktikabler Lösungen für ein eingeschränktes Optimierungsproblem -, erfordert jedoch eine andere Optimierungsroutine, und Lösungen können nicht garantiert werden.
Whuber