2016-09-05 2 views
3

Es ist ein Follow-up question. Wenn ich den unten angegebenen Code ausführe, erhalte ich ein Diagramm mit zwei R2- und p-Werten, aber mit p-Wert = 0. Dies liegt möglicherweise an einem sehr kleinen p-Wert. Ich habe versucht, nein zu erhöhen. von Ziffern bis 20 (hier signif(..p.value.., digits = 4)), aber es hat nicht funktioniert. Ich würde lieber den exakten p-Wert angeben oder Sterne verwenden, z. B. if (p<0.002) star='**' else if (p>=0.002&p<0.05) star='*' else star=''. Darüber hinaus möchte ich r Werte in der Handlung aufgeführt haben. Schauen Sie nach und lassen Sie mich wissen, welcher Teil geändert werden muss. Ich freue mich auf!Add p-Wert und r auf ggplot [Follow-up]

UPDATE

Antwort-Codes von @ eipi10 für das Hinzufügen von p-Wert der Arbeit, aber immer noch Suche nach Antworten auf Hinzufügen Korrelationskoeffizient (r) in den ggplots.

Code:

library(dplyr) 
library(ggplot2) 
library(ggpmisc) 

df <- diamonds %>% 
    dplyr::filter(cut%in%c("Fair","Ideal")) %>% 
    dplyr::filter(clarity%in%c("I1" , "SI2" , "SI1" , "VS2" , "VS1", "VVS2")) %>% 
    dplyr::mutate(new_price = ifelse(cut == "Fair", 
            price* 0.5, 
            price * 1.1)) 

formula <- y ~ x - 1 

p <- ggplot(df, aes(x,y, color=factor(cut))) 
p <- p + stat_smooth(method = "lm", formula = y ~ x-1, size = 1, level=0.95) 
p <- p + geom_point(alpha = 0.3) 
p <- p + stat_poly_eq(aes(label = paste(..rr.label..)), 
         label.x.npc = "right", label.y.npc = 0.15, formula = formula, 
         parse = TRUE, size = 3) + 
      stat_fit_glance(method = 'lm', method.args = list(formula = formula), 
         geom = 'text', aes(label = paste("P-value = ", 
         signif(..p.value.., digits = 4), sep = "")),label.x.npc = 'right', 
         label.y.npc = 0.35, size = 3) 
print(p) 

enter image description here

Antwort

3

Dies ist ein großer Datensatz und Sie können aus dem Diagramm sehen, dass der Sitz fast perfekt ist, was bedeutet, dass der p-Wert für die Regression wird zu sei winzig. Unten sind Regressionsmodelle für jede der zwei Ebenen von . Um Platz zu sparen, werden nur die wichtigsten Teile der Modell Zusammenfassungen gezeigt:

lapply(unique(df$cut), function(g) { 
    summary(lm(y ~ x - 1, df %>% filter(cut==g))) 
}) 
cut=="Ideal" 
... 
Coefficients: 
    Estimate Std. Error t value Pr(>|t|)  
x 1.001715 0.000269 3724 <2e-16 *** 
... 
Residual standard error: 0.2079 on 18291 degrees of freedom 
Multiple R-squared: 0.9987, Adjusted R-squared: 0.9987 
F-statistic: 1.387e+07 on 1 and 18291 DF, p-value: < 2.2e-16 

cut=="Fair" 
... 
Coefficients: 
    Estimate Std. Error t value Pr(>|t|)  
x 0.9895032 0.0004096 2416 <2e-16 *** 
... 
Residual standard error: 0.1033 on 1583 degrees of freedom 
Multiple R-squared: 0.9997, Adjusted R-squared: 0.9997 
F-statistic: 5.836e+06 on 1 and 1583 DF, p-value: < 2.2e-16 

Hinweis die enormen F Statistiken. Die p-Werte für solch große F-Statistiken sind im Wesentlichen Null.

pf(5.836e06, 1, 1583, lower=FALSE) 
[1] 0 

Jede Statistik F über etwa 2,400 (für den gegebenen Freiheitsgrade) einen p-Wert unter dem kleinsten Nicht-Null-Zahl, die R darstellen kann, geben.

pf(2400, 1, 1583, lower=FALSE) 
[1] 1.716433e-319 

standardmäßig, wenn R eine Reihe rundet, ist es nicht nachfolgende Nullen nicht zurückgibt (versuchen round(1.340000, 5) oder signif(1.340000,5)). Um mehr Nullen zu drucken, können Sie zum Beispiel die Ausgabezeichenfolge sprintf verwenden. Der folgende Code formatiert den p-Wert in wissenschaftlicher Notation. Bei Dezimalzahlen ersetzen Sie durch "%1.4f". Sehen Sie die Hilfe für weitere Details zu den Formatstrings:

p <- ggplot(df, aes(x,y, color=cut)) + 
    stat_smooth(method = "lm", formula = y ~ x-1, size = 1, level=0.95) + 
    geom_point(alpha = 0.3) + 
    stat_poly_eq(aes(label = paste(..rr.label..)), 
       label.x.npc = "right", label.y.npc = 0.15, formula = formula, 
       parse=TRUE, size = 3) + 
    stat_fit_glance(method = 'lm', method.args = list(formula = formula), 
        geom='text', aes(label=paste0("P-value = ", sprintf("%1.4e", ..p.value..))), 
        label.x.npc = 'right', 
        label.y.npc = 0.4, size = 3) 

enter image description here

UPDATE: Hinzufügen Sterne-p-Wert reicht, ist eine Option, ifelse Aussagen mit p-Wertebereiche wie die Bedingungen zu verwenden:

p <- ggplot(df, aes(x,y, color=cut)) + 
    stat_smooth(method = "lm", formula = y ~ x-1, size = 1, level=0.95) + 
    geom_point(alpha = 0.3) + 
    stat_poly_eq(aes(label = paste(..rr.label..)), 
       label.x.npc = "right", label.y.npc = 0.15, formula = formula, 
       parse=TRUE, size = 3) + 
    stat_fit_glance(method = 'lm', method.args = list(formula = formula), 
        geom='text', aes(label=ifelse(..p.value..< 0.001, "p<0.001**", 
               ifelse(..p.value..>=0.001 & ..p.value..<0.05, "p<0.05*", "p>0.05"))), 
        label.x.npc = 'right', 
        label.y.npc = 0.4, size = 3) 

enter image description here

+0

Sie können den p-Wert direkt auf dem Protokoll erhalten (10) skaliert, wenn Sie brauchen es wirklich: 'pf (5.836e06, 1, 1583, niedriger = FALSCH, log.p = WAHR)/log (10)' = -2824.782 –

+1

Danke @BenBolker. "Wenn du es wirklich brauchst:": Meinst du, falls ich mir Sorgen machen müsste, ob mein p-Wert wirklich 1e-2800 wäre statt der stupend größeren 1e-315? Vielleicht ist dies ein guter Zeitpunkt, um zu diesem Artikel zu verlinken (http://www.stat.columbia.edu/~gelman/research/published/signif4.pdf). – eipi10

+0

Danke @ eipi10 & @BenBolker. Ich würde es bevorzugen, Sterne zu verwenden oder den genauen p-Wert anzugeben. z.B. 'if (p <0,002) Stern =' ** 'sonst wenn (p> = 0,002 & p <0,05) Stern =' * 'sonst Stern =' ''. Irgendwelche Gedanken zum Hinzufügen von Korrelationskoeffizienten und Sternen? Ben, wo/wie Sie Ihren Log (10) Scale Code in @ eipi10 Code einbinden? – Rocky