Processing math: 100%

Två olika modeller (M1 och M2) av en elektronikutrustning har belastats (Load) och en viss svarstid (Time i mS) har uppmätts. Varje modell har haft tre olika mjukvaror. Resultaten har sammanställs i nedanstående tabell.

Några frågor:
• Finns det en skillnad mellan modeller? Är skillnaden lika för alla mjukvaror?
• Vilken betydelse har ‘Load’-variabeln?


Tabell med data som analyseras.
Tabell med data som analyseras.



Modell. En linjär modell som anger Time som en kombination av Load, SW och Mo. Termen ε kallas ofta slumpkomponent och är summan av alla variabler som inte finns i modellen.
β-koefficienterna beräknas nedan och anges som Coefficients i utskriften.


Time=β0+β1Load+β2SW+β3Mo+ϵ

library("tidyverse")                 # Load tidyverse packages
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors


Time <- c(48, 53, 57, 59, 64, 66, 57, 63, 67, 70, 76, 80, 52, 57, 60, 63, 68, 70, 61, 67, 71, 74, 80, 84, 55, 60, 64, 66, 71, 73, 65, 71, 75, 78, 84, 88)
Load <- c(152, 160, 166, 170, 178, 182, 162, 170, 176, 180, 188, 194, 152, 160, 166, 170, 178, 182, 162, 170, 176, 180, 188, 194, 152, 160, 166, 170, 178, 182, 162, 170, 176, 180, 188, 194)
SW   <- rep(c("SW1", "SW2", "SW3"), each = 12)
Mo   <- rep(c("M1", "M2"), each = 6, times = 3)

allaData <- data.frame(Time, Load, SW, Mo)

modell <- lm(Time ~ Load + SW + Mo)                    # Analys: 'lm' betyder 'Linear Model'. 
summary(modell)                                        # Visar analysens resultat.
## 
## Call:
## lm(formula = Time ~ Load + SW + Mo)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.44486 -0.47043  0.01735  0.57630  1.07983 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -54.03271    1.96128  -27.55  < 2e-16 ***
## Load          0.66471    0.01159   57.38  < 2e-16 ***
## SWSW2         3.91667    0.29620   13.22 2.77e-14 ***
## SWSW3         7.50000    0.29620   25.32  < 2e-16 ***
## MoM2          4.52020    0.26985   16.75  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7255 on 31 degrees of freedom
## Multiple R-squared:  0.995,  Adjusted R-squared:  0.9943 
## F-statistic:  1538 on 4 and 31 DF,  p-value: < 2.2e-16

Kommentar. Utskriften ovan är mer eller mindre en standardutskrift från en regressionsanalys (med en viss variation mellan datorprogram). ’Multiple R-squared’ är 0.995 (99.5%) och betyder att nästan all variation i datamängden beskrivs av den använda modellen. Resten – 0.5% – är då slumpkomponenten ε.
Längst till vänster anges de beräknade koefficienterna i modellen. Dessa används för att rita grafen nedan.


koeff <- summary(modell)$coefficients                  # Alla skattade koefficienter.

b0Mo1SW1  <- koeff[1, 1] + 0 + 0                       # Intercept för linje Mo1 SW1
b1Mo1SW1  <- koeff[2, 1]                               # Linjens lutning, samma för alla.

b0Mo1SW2  <- b0Mo1SW1 + 0 + koeff[3, 1]                # Intercept för linje Mo1 SW2
b1Mo1SW2  <- koeff[2, 1]                               # Samma lutning.

b0Mo1SW3  <- b0Mo1SW1 + 0 + koeff[4, 1]                # Intercept för linje Mo1 SW3
b1Mo1SW3  <- koeff[2, 1]                               # Samma lutning.

b0Mo2SW1  <- b0Mo1SW1 + koeff[5, 1] + 0                # Intercept för linje Mo2 SW1
b1Mo2SW1  <- koeff[2, 1]                               # Linjens lutning, samma för alla.

b0Mo2SW2  <- b0Mo1SW1 +  koeff[5, 1] + koeff[3, 1]     # Intercept för linje Mo2 SW2
b1Mo2SW2  <- koeff[2, 1]                               # Samma lutning.

b0Mo2SW3  <- b0Mo1SW1 +  koeff[5, 1] + koeff[4, 1]     # Intercept för linje Mo2 SW3
b1Mo2SW3  <- koeff[2, 1]                               # Samma lutning.


Modeller. Ur analysen kan sex modeller (‘räta linjen’) skapas (något avrundade):


• Mo1 SW1 Time = -54.03 + 0.6647*Load

•     SW2 Time = -50.12 + 0.665*Load

•     SW3 Time = -46.53 + 0.665*Load

• Mo2 SW1 Time = -49.51 + 0.665*Load

•     SW2 Time = -45.60 + 0.665*Load

•     SW3 Time = -42.01 + 0.665*Load


Skapa diagram. Följande kommandon skapar ett diagram för data och de sex modellerna.

farg     <- dplyr::recode(Mo, `M1` = "red", `M2` = "black")                # Kodar färger för modellerna.
typ      <- dplyr::recode(SW, `SW1` = 4, `SW2` = 15, `SW3` = 20)           # Kodar plottsymboler.
plotData <- data.frame(Time, Load, SW, farg)                               # Samlar plottdata i en 'dataframe'.

library(ggplot2)                                                           # Bibliotek för grafkonstruktion.

mittDiagram <- ggplot(allaData, aes(x = Load, y = Time)) + geom_point(colour = farg, shape = typ, size = 3) +
                      annotate("text", x=-Inf, y=Inf, label="Två modeller, tre mjukvaror", fontface="bold",
                               color="blue", size=4, vjust=2, hjust=-0.2) + 
                      annotate("text", x=-Inf, y=Inf, label="Röd: modell 1, svart: modell 2", fontface="bold",
                               color="black", size=3.5, vjust=4.5, hjust=-0.22)

xstart <- 151;  xstopp <- 183;  ystart <- b0Mo1SW1 + b1Mo1SW1 * xstart;  ystopp <- b0Mo1SW1 + b1Mo1SW1 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="red", linetype=3)

xstart <- 151;  xstopp <- 183;  ystart <- b0Mo1SW2 + b1Mo1SW2 * xstart;  ystopp <- b0Mo1SW2+ b1Mo1SW2 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="red", linetype=3)

xstart <- 151;  xstopp <- 183;  ystart <- b0Mo1SW3 + b1Mo1SW3 * xstart;  ystopp <- b0Mo1SW3+ b1Mo1SW3 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="red", linetype=3)

xstart <- 161;  xstopp <- 195;  ystart <- b0Mo2SW1 + b1Mo2SW1 * xstart;  ystopp <- b0Mo2SW1 + b1Mo2SW1 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="black", linetype=3)

xstart <- 161;  xstopp <- 195;  ystart <- b0Mo2SW2 + b1Mo2SW2 * xstart;  ystopp <- b0Mo2SW2+ b1Mo2SW2 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="black", linetype=3)

xstart <- 161;  xstopp <- 195;  ystart <- b0Mo2SW3 + b1Mo2SW3 * xstart;  ystopp <- b0Mo2SW3+ b1Mo2SW3 * xstopp;
mittDiagram <- mittDiagram+geom_segment(x=xstart, y=ystart, xend=xstopp, yend=ystopp, colour="black", linetype=3)
mittDiagram

See also     https://ovn.ing-stat.se/   exempel [15]


Kommentarer. Den matematiska analysmodellen ovan innehöll inga samspelstermer. Därför har alla linjer samma lutning. (Samspelstermer skulle ge linjer med olika lutning.)
Av någon anledning har förklaringsvariabeln ’Load’ olika intervall för de två modellerna på X-axeln.
Om man antar att låga ’Time’-värden (svarstider) är önskvärt så visar modell 1 ett bättre resultat. Nedersta röda linjen är SW1 i M1 som alltså är den bästa kombinationen.