set.seed(2023)
price = sort(runif(min=250,max=550,n=100))
price = price+rnorm(100,60) # <--- generar ruido en los datos

area=sort(runif(min=45,max=120,n=100))
df1=data.frame(price,area)

#Metodo para crear datos
df2=faux::rnorm_multi(n=100,vars=2,mu=c(5,6),sd=c(0.6,0.7),
                       r = 0.8,varnames=c("DE","DL"))

df2$DE[1]=4;df2$DL[1]=7.2

par(mfrow=c(1,2))
plot(x=df1$area,y=df1$price,pch=16,cex=0.5)

plot(x=df2$DE,y=df2$DL,pch=16,cex=0.7)

par(mfrow=c(2,1))

boxplot(df2$DE,horizontal=T,main="DE");boxplot(df2$DL,horizontal=T,main="DT")

mvoutlier::corr.plot(df2$DE,df2$DL)
## $cor.cla
## [1] 0.7406071
## 
## $cor.rob
## [1] 0.8280354

Un dato atipico no se considera como tal solo por ser muy extremo o muy pequeño.

Correlación se habla de dos variables aleatorios. Se trata entre pares de variables aleatorias.

Los residuales conforman el vector de los residuales, residual: distancia entre los puntos y la recta

#Estimando intercepto y pendiente
# de minimos cuadrados

plot(x=df1$area,y=df1$price,pch=16,cex=0.5)
mod1=lm(df1$price~df1$area)
summary(mod1)
## 
## Call:
## lm(formula = df1$price ~ df1$area)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.374  -5.409   0.130   5.057  16.238 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 159.7993     2.6775   59.68   <2e-16 ***
## df1$area      3.6735     0.0307  119.65   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.826 on 98 degrees of freedom
## Multiple R-squared:  0.9932, Adjusted R-squared:  0.9931 
## F-statistic: 1.432e+04 on 1 and 98 DF,  p-value: < 2.2e-16
abline(mod1,col="blue",lwd=2)

# y= E(y|x) = a +bx;  a = intercepto, b = pendiente
#Estimación de errores estandar por montecarlo 
# Mediante simulación se pueden ordenar los datos. Cosa que con el error de r se daña debido a que en esta formula no se pueden ordenar los datos.
# Intercepto y la pendiente
sim1=replicate(1500, sort(runif(min=250,max=550,n=100))+price+rnorm(100,90,20))
dim(sim1)
## [1]  100 1500
#100 datos de precio, 1500 simulaciones

intercept=c()
pendiente=c()
rsq=c()
for(i in 1:ncol(sim1)){
  mod=lm(sim1[,i]~area)
  intercept[i]=coef(mod)[1]
  pendiente[i]=coef(mod)[2]
  rsq[i]=unlist(summary(mod))$adj.r.squared
}
# Error estandar de los interceptos
sd(intercept)
## [1] 18.35944
# Error estandar de laas pendientes
sd(pendiente)
## [1] 0.1955441
hist(rsq)
abline(v=quantile(rsq,c(0.025,0.975)),
       col="blue",lwd=2)

#p = faux::rnorm_multi(n=100,vars=2,mu=c(5,6),sd=c(0.6,0.7),
#                       r = 0.8,varnames=c("DE","DL"))$DE

sim2 = replicate(1500, faux::rnorm_multi(n=100,vars=2,mu=c(5,6),sd=c(0.6,0.7),
                       r = 0.8,varnames=c("DE","DL"))$DE)


dim(sim2)
## [1]  100 1500
interceptb=c()
pendienteb=c()
rsqb=c()

#model <- lm(y ~ unlist(x))

for(i in 1:ncol(sim2)){
    mod=lm(sim2[,i]~area)
  interceptb[i]=coef(mod)[1]
  pendienteb[i]=coef(mod)[2]
  rsqb[i]=unlist(summary(mod))$adj.r.squared
}

# Error estandar de los interceptos
sd(interceptb)
## [1] 0.2314262
# Error estandar de laas pendientes
sd(pendienteb)
## [1] 0.002659694
hist(rsqb)
abline(v=quantile(rsqb,c(0.025,0.975)),
       col="red",lwd=2)