簡體   English   中英

R 在圖本身上打印線性回歸方程

[英]R print equation of linear regression on the plot itself

我們如何在繪圖上打印一條線的方程?

我有 2 個自變量,想要一個這樣的方程:

y=mx1+bx2+c

where x1=cost, x2 =targeting

我可以繪制最佳擬合線,但如何在圖中打印方程?

也許我無法在一個方程中打印 2 個自變量,但至少對於y=mx1+c我該怎么做?

這是我的代碼:

fit=lm(Signups ~ cost + targeting)
plot(cost, Signups, xlab="cost", ylab="Signups", main="Signups")
abline(lm(Signups ~ cost))

我試圖使輸出自動化一點:

fit <- lm(mpg ~ cyl + hp, data = mtcars)
summary(fit)
##Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 36.90833    2.19080  16.847  < 2e-16 ***
## cyl         -2.26469    0.57589  -3.933  0.00048 ***
## hp          -0.01912    0.01500  -1.275  0.21253 


plot(mpg ~ cyl, data = mtcars, xlab = "Cylinders", ylab = "Miles per gallon")
abline(coef(fit)[1:2])

## rounded coefficients for better output
cf <- round(coef(fit), 2) 

## sign check to avoid having plus followed by minus for negative coefficients
eq <- paste0("mpg = ", cf[1],
             ifelse(sign(cf[2])==1, " + ", " - "), abs(cf[2]), " cyl ",
             ifelse(sign(cf[3])==1, " + ", " - "), abs(cf[3]), " hp")

## printing of the equation
mtext(eq, 3, line=-2)

在此處輸入圖片說明

希望能幫助到你,

亞歷克斯

你使用?text 此外,您不應使用abline(lm(Signups ~ cost)) ,因為這是一個不同的模型(請參閱我對 CV 的回答:在多元回歸中“控制”和“忽略”其他變量之間是否有區別) . 無論如何,請考慮:

set.seed(1)
Signups   <- rnorm(20)
cost      <- rnorm(20)
targeting <- rnorm(20)
fit       <- lm(Signups ~ cost + targeting)

summary(fit)
# ...
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)
# (Intercept)   0.1494     0.2072   0.721    0.481
# cost         -0.1516     0.2504  -0.605    0.553
# targeting     0.2894     0.2695   1.074    0.298
# ...

windows();{
  plot(cost, Signups, xlab="cost", ylab="Signups", main="Signups")
  abline(coef(fit)[1:2])
  text(-2, -2, adj=c(0,0), labels="Signups = .15 -.15cost + .29targeting")
}

在此處輸入圖片說明

這是使用tidyverse包的解決方案。

關鍵是broom包,它簡化了提取模型數據的過程。 例如:

fit1 <- lm(mpg ~ cyl, data = mtcars)
summary(fit1)

fit1 %>%
    tidy() %>%
    select(estimate, term)

結果

# A tibble: 2 x 2
  estimate term       
     <dbl> <chr>      
1    37.9  (Intercept)
2    -2.88 cyl 

我編寫了一個函數來使用dplyr提取和格式化信息:

get_formula <- function(object) {
    object %>% 
        tidy() %>% 
        mutate(
            term = if_else(term == "(Intercept)", "", term),
            sign = case_when(
                term == "" ~ "",
                estimate < 0 ~ "-",
                estimate >= 0 ~ "+"
            ),
            estimate = as.character(round(abs(estimate), digits = 2)),
            term = if_else(term == "", paste(sign, estimate), paste(sign, estimate, term))
        ) %>%
        summarize(terms = paste(term, collapse = " ")) %>%
        pull(terms)
}

get_formula(fit1)

結果

[1] " 37.88 - 2.88 cyl"

然后使用ggplot2繪制線條並添加標題

mtcars %>%
    ggplot(mapping = aes(x = cyl, y = mpg)) +
    geom_point() +
    geom_smooth(formula = y ~ x, method = "lm", se = FALSE) +
    labs(
        x = "Cylinders", y = "Miles per Gallon", 
        caption = paste("mpg =", get_formula(fit1))
    )

使用 geom_smooth() 繪圖

這種繪制線條的方法實際上只對可視化兩個變量之間的關系有意義。 正如@Glen_b 在評論中指出的那樣,我們將mpg建模為cyl的函數(-2.88)所得到的斜率與我們將mpg建模為cyl和其他變量(-1.29)的函數所得到的斜率不匹配。 例如:

fit2 <- lm(mpg ~ cyl + disp + wt + hp, data = mtcars)
summary(fit2)

fit2 %>%
    tidy() %>%
    select(estimate, term)

結果

# A tibble: 5 x 2
  estimate term       
     <dbl> <chr>      
1  40.8    (Intercept)
2  -1.29   cyl        
3   0.0116 disp       
4  -3.85   wt         
5  -0.0205 hp 

也就是說,如果您想為包含未出現在圖中的變量的模型准確繪制回歸線,請改用geom_abline()並使用broom包函數獲取斜率和截距。 據我所知geom_smooth()公式不能引用尚未映射為美學的變量。

mtcars %>%
    ggplot(mapping = aes(x = cyl, y = mpg)) +
    geom_point() +
    geom_abline(
        slope = fit2 %>% tidy() %>% filter(term == "cyl") %>% pull(estimate),
        intercept = fit2 %>% tidy() %>% filter(term == "(Intercept)") %>% pull(estimate),
        color = "blue"
    ) +
    labs(
        x = "Cylinders", y = "Miles per Gallon", 
        caption = paste("mpg =", get_formula(fit2))
    )

使用 geom_abline() 繪圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM