Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Grupo 1/Grupo 1.py
2714 views
1
# -*- coding: utf-8 -*-
2
3
#%% Grupo 1. Miembros del grupo:
4
5
# 20163197, Enrique Alfonso Pazos
6
# 20191894, Ilenia Ttito
7
# 20151595, Rodrigo Ramos
8
# 20193469, Luis Eguzquiza
9
# 20163377, Jean Niño de Guzmán
10
11
#%% Pregunta 1
12
13
#Importación de la librería Numpy y Random para la creación de un Vector con valores aleatorios.
14
import random
15
import numpy as np
16
17
#Creación del Vector con números aleatorios
18
19
#Primero se crea una lista para crear los valores requeridos para el Vector
20
#Se asigna que la lista saque un total de 20 números aleatorios enteros entre 0 y 500.
21
Lista = random.sample(range(0,500),20)
22
#Se ordenan los valores para que estén de menor a mayor.
23
Lista.sort()
24
25
#Se pasan los valores de la lista hacia el Vector y indica que se imprima con su respectivo nombre.
26
Vector = np.array(Lista)
27
print('Vector =', Vector)
28
29
#Creación de la "if statement"
30
31
#Se indica que cada valor de la lista se reemplazará dependiendo de en que rango se encuentre.
32
for index, i in enumerate(Lista):
33
#Rangos que los valores seguirán para reemplazarse por otro.
34
#Se indica que se reemplacen los valores transformados en la lista .
35
if i > 0 and i <= 100:
36
Lista[index] = i**0.5
37
38
if i > 100 and i <= 300:
39
Lista[index] = i-5
40
41
if i > 300:
42
Lista[index] = 50
43
44
#Se pasan los nuevos valores de la lista hacia el vector "Resultados" y indica que se imprima con su respectivo nombre.
45
Resultado = np.array(Lista)
46
#Se indica que se muestre el Vector resultados con su respectivo nombre.
47
print('Resultado =', Resultado)
48
49
50
51
#%% Pregunta 2
52
53
import numpy as np
54
55
#### Resolución de tarea
56
"""
57
El nombre de la función será reescalar.
58
"""
59
def reescalar (X):
60
61
# Primero, pongo un condicional para que me filtre si el input que estoy colocando a la función es un n-array.
62
if not isinstance( X , np.ndarray ) :
63
# Si no es un n-array, me mostrará el siguiente mensaje:
64
raise TypeError( "El input debe ser un n-array")
65
66
# Si es un n-array, le pongo el siguiente condicional para que pase como matriz si tiene el tamaño de 5000, que
67
# es el resultado de multiplica su número de filas (100) por columnas (50).
68
elif (X.size == 5000) : # poner el número de filas x columna de la matriz: 100 x 50 = 5000
69
# Filas X = 100 , Columnas X = 50
70
# Transponemos la matriz para que sea más fácil la extracción el valor mínimo y máximo
71
# Como el ejercicio pide sacar estos valores de cada columna, al hacer la transposición,
72
# extraeré solo el máximo y mínimo valor de de las filas de la nueva matriz (X_T)
73
X_T = np.transpose(X)
74
#rows_number me da el número de filas
75
rows_number = X_T.shape[0]
76
# Genero un array que tenga desde cero hasta el número de número de filas.
77
Y = np.arange(rows_number)
78
#En principio, el resultado será un array vacío. Sobre este, haré un append más adelante, sobre el que se irán apilando uno debajo del otro los escalonamientos.
79
result = np.zeros(0)
80
81
# Voy a iterar adentro del array Y para que cada uno de sus elementos me ayude a seleccionar cada fila de X_T según su índice.
82
for j in Y:
83
# Voy a seleccionar cada fila de la matriz X_T, la cual va a pasar a llamarse Row_j
84
Row_j = X_T[j]
85
# Me va a extrar el mínimo y máximo valor de cada Row_j:
86
a = min (Row_j)
87
b = max (Row_j)
88
# Hago un array vacío sobre el que voy a colocar los resultados escalonados de cada fila más adelante
89
d = np.zeros(0)
90
91
# Ahora, voy a iterar dentro del array Row_j
92
for i in Row_j:
93
# Aquí, va a hacer el proceso de escalonamiento para cada elemento de la fila.
94
c = (i - a)/(b - a)
95
# Luego, hago una append para que ponga un resultado debajo del otro.
96
d = np.append(d, [c])
97
# Nuevamente, sobre el array vacío generado antes, hago un append de lo obtenido en d.
98
result = np.append(result, [d])
99
100
#Reordeno los resultados a la forma de la matriz X_T
101
result = result.reshape(50, 100) # Filas de X_T = 50, Columnas de X_T = 100
102
103
#Ahora, regreso la matriz a su orden natural de la matriz X.
104
result = np.transpose(result)
105
106
# Si el array no es una matriz del tamaño 5000, será un vector, el cual seguirá el siguiente proceso:
107
else :
108
# Me va a extrar el mínimo y máximo valor del vector:
109
a = min (X)
110
b = max (X)
111
d = np.zeros(0)
112
for i in X:
113
# Aquí, ve a hacer el proceso de escalonamiento para cada elemento del vector:
114
c = (i - a)/(b - a)
115
# Luego, hago una append para que ponga un resultado debajo del otro.
116
d = np.append(d, [c])
117
result = d
118
119
return result
120
121
#### Creación de la matriz
122
"""
123
Aunque la tarea no lo pide, crearé una función para poder elaborar una matriz con las dimensiones que
124
le indique, y con elementos aleatorios.
125
"""
126
def hacer_matriz (m, n):
127
# M: # de filas
128
# N: # de columnas
129
vacio = np.zeros(0)
130
numero_iteraciones = np.arange(m)
131
for i in numero_iteraciones:
132
filas = np.random.rand(n)
133
vacio = np.append(vacio, [filas])
134
vacio = vacio.reshape(m,n)
135
return vacio
136
137
#### Ejecución de la función
138
"""
139
Ahora, crearé una matriz de 100 filas y 50 columnas. También, crearé un vector de 100 columnas.
140
"""
141
m = hacer_matriz(100, 50)
142
143
resultado_matriz = reescalar (m)
144
145
v = np.random.rand(100)
146
147
resultado_vector = reescalar (v) #como se puede observar, arroja un vector fila si se abre desde variable explorer.
148
149
150
#%% Pregunta 3
151
152
import numpy as np
153
import random
154
import pandas as pd
155
156
#Se genera 5 variables con un tamaño de población de 10 mil observaciones
157
#Se genera con datos aleatorios
158
x1 = np.random.rand(10000)
159
x2 = np.random.rand(10000)
160
x3 = np.random.rand(10000)
161
x4 = np.random.rand(10000)
162
x5 = np.random.rand(10000)
163
164
#Se crea una lista con los diferentes tamaños de muestra
165
numMuestras = [10, 50, 80, 120, 200, 500, 800, 100, 5000]
166
167
#Se crean listas vacías de los coeficientes y los errores de las cuatro primeras variables
168
tamMuestra = []
169
b1 = []
170
b2 = []
171
b3 = []
172
b4 = []
173
174
e1 = []
175
e2 = []
176
e3 = []
177
e4 = []
178
179
#Creamos un bucle, para que itere el código con los diferentes tamaños de muestra
180
for i in numMuestras:
181
#Utilizamos random.choices para utilizar los valores aleatorios generados anteriormente
182
#Especificamos un k=i que contenga el número de tamaños de cada muestra
183
x1_m = random.choices(x1, k=i)
184
x2_m = random.choices(x2, k=i)
185
x3_m = random.choices(x3, k=i)
186
x4_m = random.choices(x4, k=i)
187
188
#Generamos un data frame con los valores de todas las variables de x
189
x = pd.DataFrame ({'x1': x1_m, 'x2': x2_m, 'x3': x3_m, 'x4': x4_m})
190
191
#Generamos un data frame con los valores de y
192
y_m = random.choices(x5, k=i)
193
y = pd.DataFrame({'y': y_m})
194
195
#N y P son el tamaño de las columnas y filas para la matriz que va a contener nuestros datos.
196
#Esta matriz es X_with_intercept y contendra datos del tipo float
197
N = len(x)
198
#La primera columna es contiene puros 1, las demás se rellenan con x1, x2, x3, x4
199
p = len(x.columns) + 1
200
201
X_int = np.empty(shape=(N, p), dtype=float)
202
X_int[:,0] = 1
203
X_int[:,1:p] = x.values
204
205
#Calculamos los valores de los estimadores de beta
206
b_hat = np.linalg.inv(X_int.T @ X_int) @ X_int.T @ y.values
207
208
#Estimamos los valores de y con los coeficientes de regresion lineal hallados
209
#El modelo de regresion lineal incluye un valor b almacenado en beta_hat[0], así sucesivamente
210
y_hat = b_hat[0] + (b_hat[1] * x1_m) + (b_hat[2] * x2_m) + (b_hat[3] * x3_m) + (b_hat[4] * x4_m)
211
212
#Definimos los valores de los residuos
213
residuals = y.values - y_hat
214
215
#Definimos la suma de cuadrados de los residuos (SCR)
216
SCR = residuals.T @ residuals
217
218
#Definimos el estimador de sigma al cuadrado y de la varianza
219
sigma_squared_hat = SCR[0, 0] / (N - p)
220
var_beta_hat = np.linalg.inv(X_int.T @ X_int) * sigma_squared_hat
221
222
#Utilizamos el append para agregar los datos aleatorios
223
tamMuestra.append(i)
224
b1.append(b_hat[1])
225
b2.append(b_hat[2])
226
b3.append(b_hat[3])
227
b4.append(b_hat[4])
228
229
#Utilizamos el append para agregar los datos de los errores
230
#Estimamos los errores, como teníamos la varianza, sabemos que las desviaciones se calculan sacandole raíz cuadrada
231
e1.append(var_beta_hat[1,1]**0.5)
232
e2.append(var_beta_hat[2,2]**0.5)
233
e3.append(var_beta_hat[3,3]**0.5)
234
e4.append(var_beta_hat[4,4]**0.5)
235
236
#Generamos un DataFrame que contenga los tamaños de muestra, los coeficientes (betas) y los errores de cada variable
237
df = pd.DataFrame({'Tamaño de muestra': tamMuestra, 'Beta 1': b1, 'Error x1': e1, 'Beta 2': b2,
238
'Error x2': e2, 'Beta 3': b3, 'Error x3': e3, 'Beta 4': b4,
239
'Error x4': e4})
240
print(df)
241
242
#%% Pregunta 4
243
244
import numpy as np
245
import random
246
import math
247
from scipy.stats import t # t - student
248
import pandas as pd
249
250
np.random.seed(175) # Semilla
251
252
x1 = np.random.rand(800)
253
x2 = np.random.rand(800)
254
x3 = np.random.rand(800)
255
x4 = np.random.rand(800)
256
x5 = np.random.rand(800)
257
x6 = np.random.rand(800)
258
x7 = np.random.rand(800)
259
e = np.random.normal(0,1,800)
260
261
#Proceso Gererador de datos
262
Y= 1 + 0.7*x1 + 1.1*x2 + 0.9*x3 + 1.5*x4 + 0.6*x5 + 0.3*x6 + 0.1*x7 + e
263
264
X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))
265
266
def MCO (Y, X,I=None,H =None):
267
268
# Calulcar beta y las dimensiones de n y k
269
# dependiendo de si tiene o no intercepto
270
if I is None :
271
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
272
n = X.shape[0]
273
k = X.shape[1] - 1
274
275
elif (not I is None) :
276
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
277
n = X.shape[0]
278
k = X.shape[1]
279
280
# Cálculo de Y estimado, SCR, SCT, Sigma(s2)
281
Yhat = X@beta
282
Yerror = Y-Yhat
283
Yerror2 = np.power(Yerror, 2)
284
285
SCR =(Yerror.T @Yerror)
286
Ydesv = Y - (np.ones(n)*np.mean(Y))
287
SCT =(Ydesv.T @Ydesv)
288
nk=n-k
289
s2= SCR/nk
290
291
# Cáclulo de Matriz de Varianzas y Covarianzas dependiendo
292
# si considero ajuste de White o no
293
if H is None :
294
MatVarCov= (np.linalg.inv(X.T @ X))*s2
295
296
elif (not H is None):
297
298
V=np.diag(Yerror2)
299
MatVarCov= (np.linalg.inv(X.T @ X))@(X.T@V@X)@(np.linalg.inv(X.T @ X))
300
301
# Cálculo de erro estandar, limites superiores e inferiores de los beta
302
# Pvalue, Rcuadrado, Root.MSE
303
304
sd=np.diag(MatVarCov)
305
limsup =beta + 1.96*(sd)
306
liminf =beta - 1.96*(sd)
307
t_est = np.absolute(beta/sd)
308
pvalue = (1 - t.cdf(t_est, df=nk) ) * 2
309
310
R2 = 1-(SCR/SCT)
311
Root_MSE = math.sqrt((Yerror.T @Yerror)/800)
312
313
# Agregar beta, error estandar, limites en un dataframe
314
315
df = pd.DataFrame( {"Betas": beta , "standar_error" : sd ,"Lim inf": liminf,"Lim sup": limsup,"Pvalue" : pvalue})
316
317
# Agregar Rcuadrado y ROOT-MSE en un diccionario
318
319
dic = {"Rcuadrado":R2,"ROOT-MSE":Root_MSE}
320
321
return df, dic
322
323
print(MCO(Y, X))
324
325