# -*- coding: utf-8 -*-12#%% Grupo 1. Miembros del grupo:34# 20163197, Enrique Alfonso Pazos5# 20191894, Ilenia Ttito6# 20151595, Rodrigo Ramos7# 20193469, Luis Eguzquiza8# 20163377, Jean Niño de Guzmán910#%% Pregunta 11112#Importación de la librería Numpy y Random para la creación de un Vector con valores aleatorios.13import random14import numpy as np1516#Creación del Vector con números aleatorios1718#Primero se crea una lista para crear los valores requeridos para el Vector19#Se asigna que la lista saque un total de 20 números aleatorios enteros entre 0 y 500.20Lista = random.sample(range(0,500),20)21#Se ordenan los valores para que estén de menor a mayor.22Lista.sort()2324#Se pasan los valores de la lista hacia el Vector y indica que se imprima con su respectivo nombre.25Vector = np.array(Lista)26print('Vector =', Vector)2728#Creación de la "if statement"2930#Se indica que cada valor de la lista se reemplazará dependiendo de en que rango se encuentre.31for index, i in enumerate(Lista):32#Rangos que los valores seguirán para reemplazarse por otro.33#Se indica que se reemplacen los valores transformados en la lista .34if i > 0 and i <= 100:35Lista[index] = i**0.53637if i > 100 and i <= 300:38Lista[index] = i-53940if i > 300:41Lista[index] = 504243#Se pasan los nuevos valores de la lista hacia el vector "Resultados" y indica que se imprima con su respectivo nombre.44Resultado = np.array(Lista)45#Se indica que se muestre el Vector resultados con su respectivo nombre.46print('Resultado =', Resultado)47484950#%% Pregunta 25152import numpy as np5354#### Resolución de tarea55"""56El nombre de la función será reescalar.57"""58def reescalar (X):5960# Primero, pongo un condicional para que me filtre si el input que estoy colocando a la función es un n-array.61if not isinstance( X , np.ndarray ) :62# Si no es un n-array, me mostrará el siguiente mensaje:63raise TypeError( "El input debe ser un n-array")6465# Si es un n-array, le pongo el siguiente condicional para que pase como matriz si tiene el tamaño de 5000, que66# es el resultado de multiplica su número de filas (100) por columnas (50).67elif (X.size == 5000) : # poner el número de filas x columna de la matriz: 100 x 50 = 500068# Filas X = 100 , Columnas X = 5069# Transponemos la matriz para que sea más fácil la extracción el valor mínimo y máximo70# Como el ejercicio pide sacar estos valores de cada columna, al hacer la transposición,71# extraeré solo el máximo y mínimo valor de de las filas de la nueva matriz (X_T)72X_T = np.transpose(X)73#rows_number me da el número de filas74rows_number = X_T.shape[0]75# Genero un array que tenga desde cero hasta el número de número de filas.76Y = np.arange(rows_number)77#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.78result = np.zeros(0)7980# 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.81for j in Y:82# Voy a seleccionar cada fila de la matriz X_T, la cual va a pasar a llamarse Row_j83Row_j = X_T[j]84# Me va a extrar el mínimo y máximo valor de cada Row_j:85a = min (Row_j)86b = max (Row_j)87# Hago un array vacío sobre el que voy a colocar los resultados escalonados de cada fila más adelante88d = np.zeros(0)8990# Ahora, voy a iterar dentro del array Row_j91for i in Row_j:92# Aquí, va a hacer el proceso de escalonamiento para cada elemento de la fila.93c = (i - a)/(b - a)94# Luego, hago una append para que ponga un resultado debajo del otro.95d = np.append(d, [c])96# Nuevamente, sobre el array vacío generado antes, hago un append de lo obtenido en d.97result = np.append(result, [d])9899#Reordeno los resultados a la forma de la matriz X_T100result = result.reshape(50, 100) # Filas de X_T = 50, Columnas de X_T = 100101102#Ahora, regreso la matriz a su orden natural de la matriz X.103result = np.transpose(result)104105# Si el array no es una matriz del tamaño 5000, será un vector, el cual seguirá el siguiente proceso:106else :107# Me va a extrar el mínimo y máximo valor del vector:108a = min (X)109b = max (X)110d = np.zeros(0)111for i in X:112# Aquí, ve a hacer el proceso de escalonamiento para cada elemento del vector:113c = (i - a)/(b - a)114# Luego, hago una append para que ponga un resultado debajo del otro.115d = np.append(d, [c])116result = d117118return result119120#### Creación de la matriz121"""122Aunque la tarea no lo pide, crearé una función para poder elaborar una matriz con las dimensiones que123le indique, y con elementos aleatorios.124"""125def hacer_matriz (m, n):126# M: # de filas127# N: # de columnas128vacio = np.zeros(0)129numero_iteraciones = np.arange(m)130for i in numero_iteraciones:131filas = np.random.rand(n)132vacio = np.append(vacio, [filas])133vacio = vacio.reshape(m,n)134return vacio135136#### Ejecución de la función137"""138Ahora, crearé una matriz de 100 filas y 50 columnas. También, crearé un vector de 100 columnas.139"""140m = hacer_matriz(100, 50)141142resultado_matriz = reescalar (m)143144v = np.random.rand(100)145146resultado_vector = reescalar (v) #como se puede observar, arroja un vector fila si se abre desde variable explorer.147148149#%% Pregunta 3150151import numpy as np152import random153import pandas as pd154155#Se genera 5 variables con un tamaño de población de 10 mil observaciones156#Se genera con datos aleatorios157x1 = np.random.rand(10000)158x2 = np.random.rand(10000)159x3 = np.random.rand(10000)160x4 = np.random.rand(10000)161x5 = np.random.rand(10000)162163#Se crea una lista con los diferentes tamaños de muestra164numMuestras = [10, 50, 80, 120, 200, 500, 800, 100, 5000]165166#Se crean listas vacías de los coeficientes y los errores de las cuatro primeras variables167tamMuestra = []168b1 = []169b2 = []170b3 = []171b4 = []172173e1 = []174e2 = []175e3 = []176e4 = []177178#Creamos un bucle, para que itere el código con los diferentes tamaños de muestra179for i in numMuestras:180#Utilizamos random.choices para utilizar los valores aleatorios generados anteriormente181#Especificamos un k=i que contenga el número de tamaños de cada muestra182x1_m = random.choices(x1, k=i)183x2_m = random.choices(x2, k=i)184x3_m = random.choices(x3, k=i)185x4_m = random.choices(x4, k=i)186187#Generamos un data frame con los valores de todas las variables de x188x = pd.DataFrame ({'x1': x1_m, 'x2': x2_m, 'x3': x3_m, 'x4': x4_m})189190#Generamos un data frame con los valores de y191y_m = random.choices(x5, k=i)192y = pd.DataFrame({'y': y_m})193194#N y P son el tamaño de las columnas y filas para la matriz que va a contener nuestros datos.195#Esta matriz es X_with_intercept y contendra datos del tipo float196N = len(x)197#La primera columna es contiene puros 1, las demás se rellenan con x1, x2, x3, x4198p = len(x.columns) + 1199200X_int = np.empty(shape=(N, p), dtype=float)201X_int[:,0] = 1202X_int[:,1:p] = x.values203204#Calculamos los valores de los estimadores de beta205b_hat = np.linalg.inv(X_int.T @ X_int) @ X_int.T @ y.values206207#Estimamos los valores de y con los coeficientes de regresion lineal hallados208#El modelo de regresion lineal incluye un valor b almacenado en beta_hat[0], así sucesivamente209y_hat = b_hat[0] + (b_hat[1] * x1_m) + (b_hat[2] * x2_m) + (b_hat[3] * x3_m) + (b_hat[4] * x4_m)210211#Definimos los valores de los residuos212residuals = y.values - y_hat213214#Definimos la suma de cuadrados de los residuos (SCR)215SCR = residuals.T @ residuals216217#Definimos el estimador de sigma al cuadrado y de la varianza218sigma_squared_hat = SCR[0, 0] / (N - p)219var_beta_hat = np.linalg.inv(X_int.T @ X_int) * sigma_squared_hat220221#Utilizamos el append para agregar los datos aleatorios222tamMuestra.append(i)223b1.append(b_hat[1])224b2.append(b_hat[2])225b3.append(b_hat[3])226b4.append(b_hat[4])227228#Utilizamos el append para agregar los datos de los errores229#Estimamos los errores, como teníamos la varianza, sabemos que las desviaciones se calculan sacandole raíz cuadrada230e1.append(var_beta_hat[1,1]**0.5)231e2.append(var_beta_hat[2,2]**0.5)232e3.append(var_beta_hat[3,3]**0.5)233e4.append(var_beta_hat[4,4]**0.5)234235#Generamos un DataFrame que contenga los tamaños de muestra, los coeficientes (betas) y los errores de cada variable236df = pd.DataFrame({'Tamaño de muestra': tamMuestra, 'Beta 1': b1, 'Error x1': e1, 'Beta 2': b2,237'Error x2': e2, 'Beta 3': b3, 'Error x3': e3, 'Beta 4': b4,238'Error x4': e4})239print(df)240241#%% Pregunta 4242243import numpy as np244import random245import math246from scipy.stats import t # t - student247import pandas as pd248249np.random.seed(175) # Semilla250251x1 = np.random.rand(800)252x2 = np.random.rand(800)253x3 = np.random.rand(800)254x4 = np.random.rand(800)255x5 = np.random.rand(800)256x6 = np.random.rand(800)257x7 = np.random.rand(800)258e = np.random.normal(0,1,800)259260#Proceso Gererador de datos261Y= 1 + 0.7*x1 + 1.1*x2 + 0.9*x3 + 1.5*x4 + 0.6*x5 + 0.3*x6 + 0.1*x7 + e262263X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))264265def MCO (Y, X,I=None,H =None):266267# Calulcar beta y las dimensiones de n y k268# dependiendo de si tiene o no intercepto269if I is None :270beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )271n = X.shape[0]272k = X.shape[1] - 1273274elif (not I is None) :275beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )276n = X.shape[0]277k = X.shape[1]278279# Cálculo de Y estimado, SCR, SCT, Sigma(s2)280Yhat = X@beta281Yerror = Y-Yhat282Yerror2 = np.power(Yerror, 2)283284SCR =(Yerror.T @Yerror)285Ydesv = Y - (np.ones(n)*np.mean(Y))286SCT =(Ydesv.T @Ydesv)287nk=n-k288s2= SCR/nk289290# Cáclulo de Matriz de Varianzas y Covarianzas dependiendo291# si considero ajuste de White o no292if H is None :293MatVarCov= (np.linalg.inv(X.T @ X))*s2294295elif (not H is None):296297V=np.diag(Yerror2)298MatVarCov= (np.linalg.inv(X.T @ X))@(X.T@V@X)@(np.linalg.inv(X.T @ X))299300# Cálculo de erro estandar, limites superiores e inferiores de los beta301# Pvalue, Rcuadrado, Root.MSE302303sd=np.diag(MatVarCov)304limsup =beta + 1.96*(sd)305liminf =beta - 1.96*(sd)306t_est = np.absolute(beta/sd)307pvalue = (1 - t.cdf(t_est, df=nk) ) * 2308309R2 = 1-(SCR/SCT)310Root_MSE = math.sqrt((Yerror.T @Yerror)/800)311312# Agregar beta, error estandar, limites en un dataframe313314df = pd.DataFrame( {"Betas": beta , "standar_error" : sd ,"Lim inf": liminf,"Lim sup": limsup,"Pvalue" : pvalue})315316# Agregar Rcuadrado y ROOT-MSE en un diccionario317318dic = {"Rcuadrado":R2,"ROOT-MSE":Root_MSE}319320return df, dic321322print(MCO(Y, X))323324325