2010-11-29 6 views
2

Ich möchte ein Streudiagramm erstellen und die Regressionslinie für eine Teilmenge eines Datasets zeichnen. Um ein reproduzierbares Beispiel zu geben, verwende ich den CO2-Datensatz."abline" funktioniert nicht nach "plot" wenn innerhalb "mit"

Ich habe versucht, dies aber die Regressionslinie aus irgendeinem Grunde nicht

with(subset(CO2,Type=="Quebec"),plot(conc,uptake),abline(lm(uptake~conc))) 

Was ist der richtige Weg, um einen Befehl so aussehen zu geben? Kann ich das mit einem Einzeiler machen?

Antwort

9

Sie müssen beide Codezeilen als einen einzigen R-Ausdruck angeben. Das abline() wird als ein nachfolgendes Argument zu with() genommen, welches das ... Argument ist. Dies ist dokumentiert ein Mittel, Argumente an zukünftige Methoden weiterzugeben, aber das Endergebnis ist, dass es effektiv ein schwarzes Loch für diesen Teil Ihres Codes ist.

Zwei Optionen, i) eine Zeile halten, aber der Ausdruck in { und } und trennen die beiden Ausdrücke mit ; wickeln:

with(subset(CO2,Type=="Quebec"), {plot(conc,uptake); abline(lm(uptake~conc))}) 

Oder verbreiten den Ausdruck aus über zwei Zeilen, wickelte noch in { und } :

with(subset(CO2,Type=="Quebec"), 
    {plot(conc,uptake) 
     abline(lm(uptake~conc))}) 

bearbeiten: Um ehrlich zu sein, wenn Sie solche Dinge tun, verpassen Sie die Vorteile der Teilmengenbildung durch R's Modellformeln. Ich würde dies getan hat, wie folgt:

plot(uptake ~ conc, data = CO2, subset = Type == "Quebec") 
abline(lm(uptake ~ conc, data = CO2, subset = Type == "Quebec"), col = "red") 

Die with() nur verursachen Sie Ihren Code mit Klammern und ; zu verschleiern.

+0

Super Vorschlag in Ihrem "bearbeiten". Das ist bei weitem der richtige Weg. –

+0

Es ist nur so, dass ich nicht mehr als ein einziges Mal mehrere Einschränkungen geben möchte. Es könnte gefährlich sein. – Brani

3

Von ?with: with ... wertet expr in einer lokalen Umgebung aus, die mit data erstellt wurde. Sie passieren abline() über .... Sie müssen etwas wie folgt tun:

2

Gavin und Joshua bieten gute Lösungen für Ihr unmittelbares Problem; Hier ist die äquivalente Darstellung mit ggplot:

library(ggplot2) 
qplot(conc, uptake, data = CO2[CO2$Type == "Quebec" , ]) + stat_smooth(method = "lm", se = FALSE) 
Verwandte Themen