Bioestatística
Prof. Dr. Edson Zangiacomi Martinez
Faculdade de Medicina de Ribeirão Preto
Universidade de São Paulo (USP)
Esta página está em construção!
Todo seu conteúdo não é definitivo...
Regressão linear simples
Regressão linear múltipla
Diagnósticos
Regressão linear simples
Seja o seguinte banco de dados, que inclui a idade (age) e pressão arterial sistólica (SBP) de 30 indivíduos.
id age SBP
1 39 144
2 47 220
3 45 138
4 47 145
5 65 162
6 46 142
7 67 170
8 42 124
9 67 158
10 56 154
11 64 162
12 56 150
13 59 140
14 34 110
15 42 128
16 48 130
17 45 135
18 17 114
19 20 116
20 19 124
21 36 136
22 50 142
23 39 120
24 21 120
25 44 160
26 53 158
27 63 144
28 29 130
29 25 125
30 69 175
Fonte: http://people.sc.fsu.edu/~jburkardt/datasets/regression/x03.txt
dados<-read.table("clipboard",header=T)
# Ou então, use estas linhas para ler os dados:
urlfile <- "https://raw.githubusercontent.com/edsonzmartinez/cursoR/main/idadepressao.csv"
dados <- read.csv2(urlfile,head=TRUE)
plot(dados$age,dados$SBP,xlab="Idade (anos)", ylab="Pressão arterial sistólica (mmHg)",bty="l",pch=19)
# Supondo que o valor de SBP para o indivíduo 2 é um erro de digitação
dados$age <- dados$age[dados$SBP<200]
dados$SBP <- dados$SBP[dados$SBP<200]
plot(dados$age,dados$SBP,xlab="Idade (anos) ",ylab="Pressão arterial sistólica (mmHg)",bty="l",pch=19)
# a função lm() (linear model) ajusta um modelo de regressão linear
lm(SBP~age,data=dados)
Call:
lm(formula = SBP ~ age)
Coefficients:
(Intercept) age
97.0771 0.9493
# a função summary() exibe mais detalhes sobre o ajuste do modelo
summary(lm(SBP~age,data=dados))
Call:
lm(formula = SBP ~ age)
Residuals:
Min 1Q Median 3Q Max
-19.354 -4.797 1.254 4.747 21.153
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 97.0771 5.5276 17.562 2.67e-16 ***
age 0.9493 0.1161 8.174 8.88e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 9.563 on 27 degrees of freedom
Multiple R-squared: 0.7122, Adjusted R-squared: 0.7015
F-statistic: 66.81 on 1 and 27 DF, p-value: 8.876e-09
# atribuindo ao objeto "modelo" os resultados do ajuste do modelo de regressão:
modelo <- lm(SBP~age,data=dados)
summary(modelo)
names(modelo)
[1] "coefficients" "residuals" "effects" "rank"
[5] "fitted.values" "assign" "qr" "df.residual"
[9] "xlevels" "call" "terms" "model"
modelo$coefficients
(Intercept) age
97.0770843 0.9493225
class(modelo)
[1] "lm"
# Intervalos de confiança 95% para os parâmetros:
confint(modelo)
2.5 % 97.5 %
(Intercept) 85.7354850 108.418684
age 0.7110137 1.187631
# Gráfico:
plot(dados$age,dados$SBP,xlab="Idade (anos) ",ylab="Pressão arterial sistólica (mmHg)",bty="l",pch=19)
# Inserindo a reta de regressão no gráfico:
abline(modelo)
# Valores preditos:
fitted(modelo)
1 2 3 4 5 6 7 8 9 10
134.1007 139.7966 141.6952 158.7830 140.7459 160.6817 136.9486 160.6817 150.2391 157.8337
11 12 13 14 15 16 17 18 19 20
150.2391 153.0871 129.3541 136.9486 142.6446 139.7966 113.2156 116.0635 115.1142 131.2527
21 22 23 24 25 26 27 28 29
144.5432 134.1007 117.0129 138.8473 147.3912 156.8844 124.6074 120.8101 162.5803
SBP
[1] 144 138 145 162 142 170 124 158 154 162 150 140 110 128 130 135 114 116 124 136 142 120
[23] 120 160 158 144 130 125 175
# Gráfico de valores observados versus valores preditos:
plot(dados$SBP,fitted(modelo),ylab="Valores ajustados pelo modelo",xlab="Valores observados",pch=19,bty="l", main="Valores observados x preditos")
# Diagnósticos
par(mar = c(4, 4, 2, 2), mfrow = c(2, 2))
plot(modelo)
# Teste de normalidade dos resíduos:
shapiro.test(residuals(modelo))
Shapiro-Wilk normality test
data: residuals(modelo)
W = 0.96258, p-value = 0.38
# Tabela de análise de variância (ANOVA):
anova(modelo)
Analysis of Variance Table
Response: SBP
Df Sum Sq Mean Sq F value Pr(>F)
age 1 6110.1 6110.1 66.808 8.876e-09 ***
Residuals 27 2469.3 91.5
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Gerando uma banda de confiança para a reta de regressão:
pconf <- predict(modelo,interval="confidence")
pconf
fit lwr upr
1 134.1007 130.1804 138.0210
2 139.7966 136.1528 143.4404
3 141.6952 138.0225 145.3680
4 158.7830 152.7966 164.7695
5 140.7459 137.0954 144.3964
6 160.6817 154.3105 167.0529
7 136.9486 133.2322 140.6651
8 160.6817 154.3105 167.0529
...
datanew <- data.frame(cbind(dados$age,pconf))
names(datanew) <- c("age","fit","lwr","upr")
g <- datanew[with(datanew,order(dados$age)),]
plot(dados$age,dados$SBP,xlab="Idade (anos)",ylab="Pressão arterial sistólica (mmHg)",bty="l",pch=19)
points(g$age,g$lwr,type="l",col="red")
points(g$age,g$upr,type="l",col="red")
abline(modelo,col="blue")
#
# Alternativa:
plot(dados$age,dados$SBP,xlab="Idade (anos)",ylab="Pressão arterial sistólica (mmHg)",bty="l",pch=NA)
polygon(c(g$age,rev(g$age)),c(g$lwr,rev(g$upr)),col="gray",border=NA)
points(age,SBP,pch=19)
abline(modelo,col="blue")
Regressão linear múltipla
Seja o banco de dados (clique aqui para abrir):
urlfile <- "https://raw.githubusercontent.com/edsonzmartinez/cursoR/main/altman.csv"
dados <- read.csv2(urlfile,head=TRUE)
dados
idade sexo altura CTP
1 35 F 149 3.40
2 11 F 138 3.41
3 12 M 148 3.80
4 16 F 156 3.90
5 32 F 152 4.00
6 16 F 157 4.10
7 14 F 165 4.46
8 16 M 152 4.55
9 35 F 177 4.83
10 33 F 158 5.10
11 40 F 166 5.44
12 28 F 165 5.50
13 23 F 160 5.73
14 52 M 178 5.77
15 46 F 169 5.80
16 29 M 173 6.00
17 30 F 172 6.30
18 21 F 163 6.55
19 21 F 164 6.60
20 20 M 189 6.62
21 34 M 182 6.89
22 43 M 184 6.90
23 35 M 174 7.00
24 39 M 177 7.20
25 43 M 183 7.30
26 37 M 175 7.65
27 32 M 173 7.80
28 24 M 173 7.90
29 20 F 162 8.05
30 25 M 180 8.10
31 22 M 173 8.70
32 25 M 171 9.45
# A variável dependente é a CTP, capacidade total pulmonary (litros)
# A função levels() mostra os níveis de uma variável qualitativa
levels(dados$sexo)
[1] "F" "M"
# A função contrasts() mostra como uma variável qualitativa é codificada na forma de variável dummy
contrasts(dados$sexo)
M
F 0
M 1
# Regressão linear múltipla
modelo2 <- lm(CTP ~ idade+sexo+altura,data=dados)
modelo2
summary(modelo2)
Call:
lm(formula = CTP ~ idade + sexo + altura, data = dados)
Residuals:
Min 1Q Median 3Q Max
-1.9572 -0.8404 0.0445 0.5793 2.6097
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.54361 3.67861 -2.323 0.02770 *
idade -0.02502 0.02353 -1.063 0.29665
sexoM 0.69705 0.49944 1.396 0.17379
altura 0.08955 0.02455 3.647 0.00107 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.156 on 28 degrees of freedom
Multiple R-squared: 0.5422, Adjusted R-squared: 0.4932
F-statistic: 11.05 on 3 and 28 DF, p-value: 5.822e-05
# Critério de Informação de Akaike (AIC)
AIC(modelo2)
[1] 105.808
# Diagnósticos
par(mar = c(4, 4, 2, 2), mfrow = c(2, 2))
plot(modelo2)