Sobre el autor:
Jimmy Cueva Ruesta
E-mail: jcueva/@usat.edu.pe
LinkedIn: https://www.linkedin.com/in/jimmy-cueva-ruesta-30852811b/
Con base en 32 empresas estadounidense de la industria química, se tiene la base de datos I&D.xls, del cual se tienen las siguientes variables de interés:
rm(list=ls())
library(readxl)
datos <- read_excel("C:/Users/Jimmy Cueva/Desktop/R para finanzas/Econometría/Regresión general/I&D/I&D.xlsx")
View(datos)
attach(datos) #Permite acceder a las columnas de un data frame directamente por nombre
names(datos)## [1] "N" "ID" "VENTAS" "MG" "BENEFICIOS"
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 32 153.68 324.64 42.6 66.72 47.44 1.7 1428 1426.3 2.82 7.2
## se
## X1 57.39
## 10% 25% 50% 75% 90%
## 3.52 10.85 42.60 78.85 406.64
Confirme e interprete los coeficientes de correlación para las tres variables con su nivel de significancia estadística.
library(car)
boxplot(datos$VENTAS,
main = "Diagrama de Cajas de Ventas",
ylab = "Monto de Ventas",
col = "lightblue",
border = "darkblue")boxplot(datos[, c("VENTAS", "ID")],
main = "Distribución de Variables",
col = c("skyblue", "salmon"))Variable ventas: El cajón (box) representa el rango intercuartílico, donde se concentra el 50% central de las empresas.
La línea dentro del cajón es la mediana, que se encuentra cerca de la base del cajón → indica que la mayoría de las empresas tienen ventas por debajo del promedio general.
Los puntos fuera del bigote superior son valores atípicos (outliers), es decir, empresas con ventas extraordinariamente altas, que distorsionan el promedio.
Esto sugiere alta dispersión y la posible presencia de empresas grandes junto a muchas pequeñas (heterogeneidad empresarial).
Variable ID (Gasto en I+D): La caja es muy estrecha y cercana al eje cero, lo que muestra que la mayoría de las empresas invierten poco o casi nada en I+D.
También aparecen algunos outliers, es decir, pocas empresas con gastos muy elevados en investigación y desarrollo en comparación con el resto.
Esto refleja una brecha tecnológica o de innovación significativa entre empresas.
Conclusión: El diagrama evidencia una alta desigualdad tanto en ventas como en gasto en I+D, con predominio de valores bajos y pocos casos extremos muy altos. Esto refleja un sector empresarial heterogéneo, donde la mayoría de las firmas operan a pequeña escala, y la inversión en innovación es limitada y concentrada en pocas empresas.
scatterplot(ID~VENTAS, regLine=TRUE, smooth=FALSE, boxplots='xy',
ellipse=list(levels=c(.5, .9)), xlab="Ventas (en millones de USD)",
ylab="I&D (en mill. de USD)",
main="Relación entre Ventas e I&D")scatterplot(ID~MG, regLine=TRUE, smooth=FALSE, boxplots='xy',
ellipse=list(levels=c(.5, .9)), xlab="Mg de Benef. (Benef. en % de ventas)",
ylab="I&D (en mill. de USD)",
main="Relación entre Margen de beneficios e I&D")## ID VENTAS MG
## ID 1.00000000 0.949592876 0.014700184
## VENTAS 0.94959288 1.000000000 -0.004658616
## MG 0.01470018 -0.004658616 1.000000000
Primera estimación: \[ log(\widehat{ID})_i= \widehat{\alpha}+ \widehat{\beta}* log(VENTAS)_i+\widehat{\varepsilon_i} \] Segunda estimación: \[ log(\widehat{ID})_i= \widehat{\alpha}+ \widehat{\beta}* log(VENTAS)_i+\widehat{\delta}MG_i +\widehat{\varepsilon_i} \] Creamos las variables log
##
## Call:
## lm(formula = logID ~ logventas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.90406 -0.40086 -0.02178 0.40562 1.10438
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.10472 0.45277 -9.066 4.27e-10 ***
## logventas 1.07573 0.06183 17.399 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5294 on 30 degrees of freedom
## Multiple R-squared: 0.9098, Adjusted R-squared: 0.9068
## F-statistic: 302.7 on 1 and 30 DF, p-value: < 2.2e-16
## [1] 0.01649464
##
## Call:
## lm(formula = logID ~ logventas + MG)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.97681 -0.31502 -0.05828 0.39020 1.21783
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.37827 0.46802 -9.355 2.93e-10 ***
## logventas 1.08422 0.06020 18.012 < 2e-16 ***
## MG 0.02166 0.01278 1.694 0.101
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5136 on 29 degrees of freedom
## Multiple R-squared: 0.918, Adjusted R-squared: 0.9123
## F-statistic: 162.2 on 2 and 29 DF, p-value: < 2.2e-16
## [1] 0.01254705
##
## Jarque Bera Test
##
## data: mod1$residuals
## X-squared = 1.025, df = 2, p-value = 0.599
##
## Shapiro-Wilk normality test
##
## data: mod1$residuals
## W = 0.97661, p-value = 0.6968
##
## Jarque Bera Test
##
## data: mod2$residuals
## X-squared = 0.67063, df = 2, p-value = 0.7151
##
## Shapiro-Wilk normality test
##
## data: mod2$residuals
## W = 0.97898, p-value = 0.7695
Interpretación general
Si el p-valor < 0.05, se rechaza la normalidad de los residuos.
Si el p-valor > 0.05, no hay evidencia suficiente para rechazar la normalidad.
Ver en formato tabla
library(tibble) # para crear tablas elegantes
library(dplyr) # para manipular datos fácilmente
library(tidyr) # (opcional) para formatear la tabla
jarque1 <- tseries::jarque.bera.test(mod1$residuals)
shapiro1 <- shapiro.test(mod1$residuals)
jarque2 <- tseries::jarque.bera.test(mod2$residuals)
shapiro2 <- shapiro.test(mod2$residuals)
tabla_normalidad <- tibble(
Modelo = c("Modelo 1", "Modelo 1", "Modelo 2", "Modelo 2"),
Prueba = c("Jarque-Bera", "Shapiro-Wilk", "Jarque-Bera", "Shapiro-Wilk"),
Estadístico = c(jarque1$statistic, shapiro1$statistic, jarque2$statistic, shapiro2$statistic),
p_valor = c(jarque1$p.value, shapiro1$p.value, jarque2$p.value, shapiro2$p.value)
)
print(tabla_normalidad)## # A tibble: 4 × 4
## Modelo Prueba Estadístico p_valor
## <chr> <chr> <dbl> <dbl>
## 1 Modelo 1 Jarque-Bera 1.02 0.599
## 2 Modelo 1 Shapiro-Wilk 0.977 0.697
## 3 Modelo 2 Jarque-Bera 0.671 0.715
## 4 Modelo 2 Shapiro-Wilk 0.979 0.770
Ver histograma
hist(mod1$residuals, breaks = 15, col = "skyblue", probability = TRUE,
main = "Histograma de los residuos vs curva teórica del modelo 1", xlab = "Residuos")
curve(dnorm(x, mean = mean(mod1$residuals), sd = sd(mod1$residuals)), add = TRUE, col = "red", lwd = 2)hist(mod2$residuals, breaks = 15, col = "skyblue", probability = TRUE,
main = "Histograma de los residuos vs curva teórica del modelo 2", xlab = "Residuos")
curve(dnorm(x, mean = mean(mod2$residuals), sd = sd(mod2$residuals)), add = TRUE, col = "red", lwd = 2)Prueba de Goldfed-Quandt Test Ho: Los residuos son homoscedásticos.
##
## Goldfeld-Quandt test
##
## data: mod1
## GQ = 1.4181, df1 = 14, df2 = 14, p-value = 0.261
## alternative hypothesis: variance increases from segment 1 to 2
##
## Goldfeld-Quandt test
##
## data: mod2
## GQ = 1.2124, df1 = 13, df2 = 13, p-value = 0.3668
## alternative hypothesis: variance increases from segment 1 to 2
Prueba Harrison-McCabe test
##
## Harrison-McCabe test
##
## data: mod1
## HMC = 0.41212, p-value = 0.251
##
## Harrison-McCabe test
##
## data: mod2
## HMC = 0.43946, p-value = 0.32
Breusch Pagan
##
## studentized Breusch-Pagan test
##
## data: mod1
## BP = 0.00036846, df = 1, p-value = 0.9847
##
## studentized Breusch-Pagan test
##
## data: mod2
## BP = 0.25463, df = 2, p-value = 0.8805
Glejser
## # A tibble: 1 × 4
## statistic p.value parameter alternative
## <dbl> <dbl> <dbl> <chr>
## 1 0.00436 0.947 1 greater
## # A tibble: 1 × 4
## statistic p.value parameter alternative
## <dbl> <dbl> <dbl> <chr>
## 1 0.290 0.865 2 greater
Asintótica de White
## # A tibble: 1 × 5
## statistic p.value parameter method alternative
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 0.296 0.862 2 White's Test greater
## # A tibble: 1 × 5
## statistic p.value parameter method alternative
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 0.795 0.939 4 White's Test greater
# Ejecutas las pruebas
library(lmtest)
library(car)
library(olsrr)
# Resultados de las pruebas
tests <- data.frame(
Prueba = c("Breusch-Pagan", "Harvey-Collier", "Glejser", "White"),
Mod1_p = c(bptest(mod1)$p.value,
hmctest(mod1)$p.value,
glejser(mod1)$p.value,
white(mod1)$p.value),
Mod2_p = c(bptest(mod2)$p.value,
hmctest(mod2)$p.value,
glejser(mod2)$p.value,
white(mod2)$p.value)
)
# Crear una función para interpretar
interpretar <- function(p) ifelse(p > 0.05, "Sí (Homocedástica)", "No (Heterocedástica)")
# Añadir columnas interpretadas
tests$Mod1_Homocedástica <- interpretar(tests$Mod1_p)
tests$Mod2_Homocedástica <- interpretar(tests$Mod2_p)
# Mostrar la tabla final
print(tests, digits = 4)## Prueba Mod1_p Mod2_p Mod1_Homocedástica Mod2_Homocedástica
## 1 Breusch-Pagan 0.9847 0.8805 Sí (Homocedástica) Sí (Homocedástica)
## 2 Harvey-Collier 0.2340 0.3030 Sí (Homocedástica) Sí (Homocedástica)
## 3 Glejser 0.9474 0.8650 Sí (Homocedástica) Sí (Homocedástica)
## 4 White 0.8624 0.9391 Sí (Homocedástica) Sí (Homocedástica)
## logventas MG
## 1.006978 1.006978
##
## Call:
## omcdiag(mod = mod, Inter = TRUE, detr = detr, red = red, conf = conf,
## theil = theil, cn = cn)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.9931 0
## Farrar Chi-Square: 0.2051 0
## Red Indicator: 0.0832 0
## Sum of Lambda Inverse: 2.0140 0
## Theil's Method: -0.9041 0
## Condition Number: 11.5241 0
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
##
## Call:
## imcdiag(mod = mod, method = method, corr = FALSE, vif = vif,
## tol = tol, conf = conf, cvif = cvif, ind1 = ind1, ind2 = ind2,
## leamer = leamer, all = all)
##
##
## All Individual Multicollinearity Diagnostics Result
##
## VIF TOL Wi Fi Leamer CVIF Klein IND1 IND2
## logventas 1.007 0.9931 0.2093 Inf 0.9965 0.9174 0 0.0331 1
## MG 1.007 0.9931 0.2093 Inf 0.9965 0.9174 0 0.0331 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
##
## MG , coefficient(s) are non-significant may be due to multicollinearity
##
## R-square of y on all x: 0.918
##
## * use method argument to check which regressors may be the reason of collinearity
## ===================================
Rainbow analysis Ho: El modelo es lineal (en las variables) H1: El modelo no es lineal (en las variables)
##
## Rainbow test
##
## data: mod1
## Rain = 1.6378, df1 = 16, df2 = 14, p-value = 0.1797
##
## Rainbow test
##
## data: mod2
## Rain = 1.9432, df1 = 16, df2 = 13, p-value = 0.1163
#No existe especificación cuadrática o cúbica en el modelo
# H0: Forma funcional es correcta
reset_1 <- resettest(mod1 , power=2, type="fitted")
resettest(mod1 , power=3, type="fitted")##
## RESET test
##
## data: mod1
## RESET = 0.83618, df1 = 1, df2 = 29, p-value = 0.368
##
## RESET test
##
## data: mod2
## RESET = 1.0952, df1 = 1, df2 = 28, p-value = 0.3043
tabla_correcta_especificación <- tibble(
Modelo = c("Modelo 1", "Modelo 1", "Modelo 2", "Modelo 2"),
Prueba = c("Arcoíris", "Ramsey", "Arcoíris", "Ramsey"),
Estadístico = c(rain1$statistic, reset_1$statistic, rain2$statistic, reset_2$statistic),
p_valor = c(rain1$p.value, reset_1$p.value, rain2$p.value, reset_2$p.value)
)
# Añadimos la columna de interpretación
tabla_correcta_especificación <- tabla_correcta_especificación %>%
mutate(
Correcta_Forma_Funcional = ifelse(p_valor > 0.05,
"Sí (Correcta especificación)",
"No (Forma funcional incorrecta)")
)
print(tabla_correcta_especificación)## # A tibble: 4 × 5
## Modelo Prueba Estadístico p_valor Correcta_Forma_Funcional
## <chr> <chr> <dbl> <dbl> <chr>
## 1 Modelo 1 Arcoíris 1.64 0.180 Sí (Correcta especificación)
## 2 Modelo 1 Ramsey 2.38 0.134 Sí (Correcta especificación)
## 3 Modelo 2 Arcoíris 1.94 0.116 Sí (Correcta especificación)
## 4 Modelo 2 Ramsey 2.32 0.139 Sí (Correcta especificación)
# Prueba F (análoga a una prueba de restricciones)
f_test <- anova(mod1, mod2)
# Prueba de Wald
wald_test <- waldtest(mod1, mod2)
# Prueba de razón de verosimilitud (LR)
lr_test <- lrtest(mod1, mod2)
# Criterios de información
aic_values <- AIC(mod1, mod2)
bic_values <- BIC(mod1, mod2)
# --- TABLA DE RESULTADOS ESTADÍSTICOS ---
tabla_comparacion <- tibble(
Prueba = c("Wald", "F", "Razón de verosimilitud (LR)"),
Estadístico = c(wald_test$F[2], f_test$F[2], lr_test$Chisq[2]),
p_valor = c(wald_test$`Pr(>F)`[2], f_test$`Pr(>F)`[2], lr_test$`Pr(>Chisq)`[2])
)
# --- INTERPRETACIÓN SEGÚN p-value ---
tabla_comparacion <- tabla_comparacion %>%
mutate(
Diferencia_Significativa = ifelse(p_valor <= 0.05, "Sí (Modelos diferentes)", "No (Modelos similares)"),
Modelo_Recomendado = ifelse(p_valor <= 0.05, "Modelo 2 (más completo)", "Modelo 1 (más parsimonioso)")
)
# --- TABLA DE CRITERIOS DE INFORMACIÓN ---
tabla_info <- tibble(
Modelo = c("Modelo 1", "Modelo 2"),
AIC = aic_values$AIC,
BIC = bic_values$BIC
) %>%
mutate(
Mejor_Modelo_AIC = ifelse(AIC == min(AIC), "✔", ""),
Mejor_Modelo_BIC = ifelse(BIC == min(BIC), "✔", "")
)
# Mostrar resultados
print(tabla_comparacion, digits = 4)## # A tibble: 3 × 5
## Prueba Estadístico p_valor Diferencia_Significa…¹ Modelo_Recomendado
## <chr> <dbl> <dbl> <chr> <chr>
## 1 Wald 2.87 0.101 No (Modelos similares) Modelo 1 (más par…
## 2 F 2.87 0.101 No (Modelos similares) Modelo 1 (más par…
## 3 Razón de verosi… 3.02 0.0822 No (Modelos similares) Modelo 1 (más par…
## # ℹ abbreviated name: ¹Diferencia_Significativa
## # A tibble: 2 × 5
## Modelo AIC BIC Mejor_Modelo_AIC Mejor_Modelo_BIC
## <chr> <dbl> <dbl> <chr> <chr>
## 1 Modelo 1 54.0 58.4 "" "✔"
## 2 Modelo 2 53.0 58.9 "✔" ""
Interpretación de la primera tabla:
En todas las pruebas, el p-value > 0.05, por lo tanto no hay evidencia estadística suficiente para afirmar que el Modelo 2 sea significativamente mejor que el Modelo 1.
En consecuencia, ambos modelos explican los datos de manera similar.
Dado eso, se recomienda mantener el Modelo 1, porque es más parsimonioso (usa menos variables
Interpretación de la segunda tabla:
AIC es ligeramente menor en el Modelo 2, lo que sugiere que tiene un mejor ajuste.
BIC, sin embargo, favorece al Modelo 1, porque penaliza más la complejidad (número de parámetros).
Como las diferencias son pequeñas y las pruebas estadísticas no mostraron diferencias significativas, el criterio de decisión final es:Elegir el Modelo 1 por parsimonia y porque no hay mejora significativa al incluir más variables.
. Para el mejor modelo seleccionado estime los intervalos de confianza según la técnica de Muestreo Bootstrap
## Bootstrap basic confidence intervals
##
## 2.5 % 97.5 %
## (Intercept) -5.080123685 -3.20256237
## logventas 0.936837049 1.18204390
## MG -0.007068097 0.04401046
Interpretación: Genera una distribución empírica de los coeficientes del modelo repitiendo la estimación 999 veces con muestras distintas (con reemplazo).Eso permite obtener intervalos de confianza robustos y analizar la estabilidad de los parámetros.
# Reglas de decisión dada la Prob. (p-value)
# Prob. < 5 y es < 1%; rechazamos la Ho.
# Prob. > 5% y > 10%; No se rechaza la Ho.
# Ho: MG =0
# H1: MG es diferente de 0
linearHypothesis(mod2, "MG = 0")##
## Linear hypothesis test:
## MG = 0
##
## Model 1: restricted model
## Model 2: logID ~ logventas + MG
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 30 8.4077
## 2 29 7.6505 1 0.75717 2.8701 0.101
##
## Linear hypothesis test:
## logventas = 1
##
## Model 1: restricted model
## Model 2: logID ~ logventas + MG
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 30 8.1669
## 2 29 7.6505 1 0.51642 1.9575 0.1724
##
## Call:
## lm(formula = logID ~ logventas + MG)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.97681 -0.31502 -0.05828 0.39020 1.21783
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.37827 0.46802 -9.355 2.93e-10 ***
## logventas 1.08422 0.06020 18.012 < 2e-16 ***
## MG 0.02166 0.01278 1.694 0.101
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5136 on 29 degrees of freedom
## Multiple R-squared: 0.918, Adjusted R-squared: 0.9123
## F-statistic: 162.2 on 2 and 29 DF, p-value: < 2.2e-16
## [1] 1.399003
# n-k-1 = 32 -2 -1 = 29 grados de libertad
signif<- c(0.10, 0.05, 0.01) # al 5 y 1% de significancia estadística
# t crítico
qt(1-signif, 29)## [1] 1.311434 1.699127 2.462021
## [1] 0.08620849
# Ho: logventas = MG = 0
# H1: logventas y MG son diferentes de cero
hipotesis<-c("logventas=0", "MG=0")
linearHypothesis(mod2, hipotesis)##
## Linear hypothesis test:
## logventas = 0
## MG = 0
##
## Model 1: restricted model
## Model 2: logID ~ logventas + MG
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 31 93.247
## 2 29 7.651 2 85.597 162.23 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# La suma de los efectos de Ventas + MG = 1.20
#Ho: ID + MG = 1.20
#Ho: ID + MG ES DIFERENTE DE 1.20
linearHypothesis(mod2, "logventas+ MG= 1.2")##
## Linear hypothesis test:
## logventas + MG = 1.2
##
## Model 1: restricted model
## Model 2: logID ~ logventas + MG
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 30 8.2475
## 2 29 7.6505 1 0.597 2.263 0.1433
library(stargazer)
stargazer(mod1, mod2, type="text",
title = "Resultados de regresiones, modelos alternativos")##
## Resultados de regresiones, modelos alternativos
## ===================================================================
## Dependent variable:
## -----------------------------------------------
## logID
## (1) (2)
## -------------------------------------------------------------------
## logventas 1.076*** 1.084***
## (0.062) (0.060)
##
## MG 0.022
## (0.013)
##
## Constant -4.105*** -4.378***
## (0.453) (0.468)
##
## -------------------------------------------------------------------
## Observations 32 32
## R2 0.910 0.918
## Adjusted R2 0.907 0.912
## Residual Std. Error 0.529 (df = 30) 0.514 (df = 29)
## F Statistic 302.722*** (df = 1; 30) 162.231*** (df = 2; 29)
## ===================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
stargazer(mod1, mod2, type="text",
title = "Resultados de regresiones, modelos alternativos",
dep.var.labels = "Log (Gasto en I&D)",
intercept.bottom = FALSE,
column.labels = c("MCO", "MCO"),
notes= "Comentarios a rogerbanegas.edu.bo",
covariate.labels = c("Constante","Log (Ventas)", "MG de beneficios (en %)"))##
## Resultados de regresiones, modelos alternativos
## =======================================================================
## Dependent variable:
## -----------------------------------------------
## Log (Gasto en I&D)
## MCO MCO
## (1) (2)
## -----------------------------------------------------------------------
## Constante -4.105*** -4.378***
## (0.453) (0.468)
##
## Log (Ventas) 1.076*** 1.084***
## (0.062) (0.060)
##
## MG de beneficios (en %) 0.022
## (0.013)
##
## -----------------------------------------------------------------------
## Observations 32 32
## R2 0.910 0.918
## Adjusted R2 0.907 0.912
## Residual Std. Error 0.529 (df = 30) 0.514 (df = 29)
## F Statistic 302.722*** (df = 1; 30) 162.231*** (df = 2; 29)
## =======================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
## Comentarios a rogerbanegas.edu.bo