Path: blob/main/Trabajo_grupal/WG1/Grupo_4_py.py
2714 views
# -*- coding: utf-8 -*-1"""#-------------------------------------------------------------------------------234TAREA 1- GRUPO 4567"""#--------------------------------------------------------------------------------8910#%% PREGUNTA 1111213#### Importamos las librerías correspondientes.1415import numpy as np16import math1718from numpy import random192021#### Generamos un vector de 500 valores aleatorios, de donde se escogerán 20 datos2223x=np.random.randint(500, size=(20))2425print(x)262728#### Construimos el primer if statement (w), que sacará la raíz cuadrada a cada uno de los elementos que cumplan con la condición de estar entre 0 y 100.293031w = x**0.53233if (w < 100).all():34print("Number is smaller than one hundred")3536elif (w > 0):37print("Number is greater than Zero")3839else:40print("Number is Zero")41424344#### Construimos el segundo if statement (j), que le restará 5 a cada uno de los elementos que cumplan con la condición de tomar valores entre 100 y 300.4546j= (x-5) .all()47if (j < 300):48print("Number is smaller than three hundred")49elif (j > 100):50print("Number is greater than one hundred")51else:52print("Number is Zero")53545556#### Construimos el último if statement (p), que igualará a 50 a cada uno de los elementos que cumplan con la condición de ser mayores a 300.5758p = 5059if p > 300:60print(p, "is s greater than three hundred")61626364#%% PREGUNTA 26566#### Importamos las librerías necesarias6768import numpy as np69from numpy import random707172#### Creamos el vector con 100 observaciones enteras aleatorias7374v=np.random.randint(100, size=(100))7576print(v)777879#### Creamos la matriz de 100 x 50 con observaciones enteras aleatorias8081m=np.random.randint(0, 101, (100, 50))8283print (m)848586#### Creamos la función que nos diga si es una matriz o vector de tipo np.nd array y bote mensaje si no lo es87#### En caso el objeto sea un vector o matriz, la función hallará el valor del escalar y reajustará la matriz y vector de acuerdo a este, dando como resultado la matriz ajustada.88def escalar (M):8990if not isinstance(M, np.ndarray ) :91raise TypeError( "x debe ser una matriz o vector")929394else:9596a = M.max(axis=0)97b = M.min(axis=0)98e = (M-b)/(a-b)99M=M*e100101return M102103104#### Probamos la función en nuestro vector y obtenemos el vector ajustado por el escalar.105106print (escalar(v))107108#### Probamos la función en nuestra matriz y obtenemos la matriz ajustada por el escalar.109110print (escalar(m))111112#%% PREGUNTA 3113114import numpy as np115import random116from scipy.stats import t # t - student117import pandas as pd118119#número de observaciones= 10000120121#fijamos una semilla122np.random.seed(175)123124#creamos 5 variables, las cuales tienen una distribución uniforme de entre [0,1]125126x1 = np.random.rand(10000)127print(x1)128x2 = np.random.rand(10000)129print(x2)130x3 = np.random.rand(10000)131x4 = np.random.rand(10000)132x5 = np.random.rand(10000)133e = np.random.normal(0,1,10000) # normal distribution mean = 0 and sd = 1134135# El modelo sin contar a la explicativa x5 sería:136# Y = b1*x1 + b2*x2 + b3*x3 + b4*x4 + e137138Y = 0.7*x1 + 1.6*x2 + 0.3*x3 + 1.8*x4 + e139140X = np.column_stack((np.ones(10000),x1,x2,x3,x4,x5))141print(X)142143beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )144print(beta)145146####Creamos una tupla con los tamaños de muestra147148m = (10,50,80,120,200,500,800)149150#### Con un m=10151152w1=np.array(random.sample( range(10000) , m[0] ))153print(w1)154w2=np.array(random.sample(range(10000) , m[0] ))155w3=np.array(random.sample( range(10000) , m[0] ))156w4=np.array(random.sample( range(10000) , m[0] ))157w5=np.array(random.sample( range(10000) , m[0] ))158b = np.random.normal(0,1,m[0])159160Y_1 = 0.7*w1 + 1.6*w2 + 0.3*w3 + 1.8*w4 + b161162X_1 = np.column_stack((np.ones( m[0]),w1,w2,w3,w4,w5))163print(X_1)164165beta1 = np.linalg.inv(X_1.T @ X_1) @ ((X_1.T) @ Y_1 )166print(beta1)167168y_est_1 = X_1 @ beta1169n1 = X_1.shape[0]170k1 = X_1.shape[1] - 1171nk1 = n1 - k1172sigma = sum(list( map( lambda x: x**2 , Y_1 - y_est_1) )) / nk1173Var = sigma*np.linalg.inv(X_1.T @ X_1)174sd1 = np.sqrt( np.diag(Var) )175print(sd1)176177#### Con un m=50178179r1=np.array(random.sample( range(10000) , m[1] ))180r2=np.array(random.sample(range(10000) , m[1] ))181r3=np.array(random.sample( range(10000) , m[1] ))182r4=np.array(random.sample( range(10000) , m[1] ))183r5=np.array(random.sample( range(10000) , m[1] ))184l = np.random.normal(0,1,m[1])185186Y_2 = 0.7*r1 + 1.6*r2 + 0.3*r3 + 1.8*r4 + l187188X_2 = np.column_stack((np.ones( m[1]),r1,r2,r3,r4,r5))189print(X_2)190191beta2 = np.linalg.inv(X_2.T @ X_2) @ ((X_2.T) @ Y_2 )192print(beta2)193194y_est_2 = X_2 @ beta2195n2 = X_2.shape[0]196k2 = X_2.shape[1] - 1197nk2 = n2 - k2198sigma = sum(list( map( lambda x: x**2 , Y_2 - y_est_2) )) / nk2199Var = sigma*np.linalg.inv(X_2.T @ X_2)200sd2 = np.sqrt( np.diag(Var) )201print(sd2)202203#### Con un m=80204205f1=np.array(random.sample( range(10000) , m[2] ))206f2=np.array(random.sample(range(10000) , m[2] ))207f3=np.array(random.sample( range(10000) , m[2] ))208f4=np.array(random.sample( range(10000) , m[2] ))209f5=np.array(random.sample( range(10000) , m[2] ))210f = np.random.normal(0,1,m[2])211212Y_3 = 0.7*f1 + 1.6*f2 + 0.3*f3 + 1.8*f4 + f213214X_3 = np.column_stack((np.ones( m[2]),f1,f2,f3,f4,f5))215print(X_3)216217beta3 = np.linalg.inv(X_3.T @ X_3) @ ((X_3.T) @ Y_3 )218print(beta3)219220y_est_3 = X_3 @ beta3221n3 = X_3.shape[0]222k3 = X_3.shape[1] - 1223nk3 = n3 - k3224sigma = sum(list( map( lambda x: x**2 , Y_3 - y_est_3) )) / nk3225Var = sigma*np.linalg.inv(X_3.T @ X_3)226sd3 = np.sqrt( np.diag(Var) )227print(sd3)228229230sd=(sd1,sd2,sd3)231print(sd)232233df = pd.DataFrame( {"tamaño de muestra": m , "standar_error" : sd ,234"coeficiente" : beta} )235236#%% PREGUNTA 4237238#### Importamos 'numpy' y 'random' como para poder generar una semilla aleatoria para producir números aleatorios "239import numpy as np240import random241import pandas as pd242from scipy.stats import t243import seaborn as sns244245random.seed(175)246247248#### Crear un proceso generador de datos con 8 variables (intercepto y 7 explicativas) y 800 observaciones249#### Como queremos 800 observaciones, generaremos 800 números aleatorios que serán seleccionados dentro de las variables explicativas y el error"250251#### Además, las variables explicativas tienen distribución uniforme de entre [0,1]"252x1 = np.random.rand(800)253x2 = np.random.rand(800)254x3 = np.random.rand(800)255x4 = np.random.rand(800)256x5 = np.random.rand(800)257x6 = np.random.rand(800)258x7 = np.random.rand(800)259e = np.random.normal(0,1,800)260z = np.random.rand(800)261#### El término de perturbación o error se diferencia porque tiene distribución normal, con media 0 y desviación estándar 1."262263#### GDP. El modelo sería Y = B0+B1*x1+B2*x2+B3*x3+B4*x4+B5*x5+B6*x6+B7*x7+e264Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + 2.5*x5 + 0.8*x6 + 1.7*x7 + e265266#### Juntamos los vectores en una sola matriz para hallar las X, no olvidemos añadir el vector de unos con "np.ones(800)"267X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))268print(X)269270271#### Ahora, procedemos a crear una función que realice:272#### Vector de coeficientes, error estándar de cada coeficiente estimado, P-value de cada variable , limite inferior del intervalo de confianza, limite superior del intervalo de confianza, R cuadrado , Root-MSE (raíz cuadrada del error cuadrático medio).273274def ols(M,Y, standar = True, Pvalue = True, instrumento = None, index = None):275if standar and Pvalue and (instrumento is None) and (index is None):276beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y ) ## Para hallar las betas debemos transponer la matriz y las multiplicamos con el uso del operador "@". Este sería el vector de coeficientes.277y_est = X @ beta278n = X.shape[0]279k = X.shape[1] - 1280nk = n - k ## grados de libertad281sigma = sum(list( map( lambda x: x**2 , Y - y_est) )) / nk282Var = sigma*np.linalg.inv(X.T @ X)283sd = np.sqrt( np.diag(Var) ) ## sacamos raíz cuadrada a los elementos de la diagonal principal284t_est = np.absolute(beta/sd)285pvalue = (1 - t.cdf(t_est, df=nk) ) * 2286lim_inf = beta - 1.96 * sd ## Dato para hallar los límites superiores e inferiores del intervalo del confianza287lim_sup = beta + 1.96 * sd288df = pd.DataFrame( {"OLS": beta , "standar_error" : sd ,289"Pvalue" : pvalue, "Límite_inferior" : lim_inf, "Límite_superior" : lim_sup })290291292elif (not instrumento is None) and (not index is None) :293294beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )295296index = index - 1297Z = X298Z[:,index] = z ## se reemplaza la variable endógena por el instrumento en la matriz de covariables299beta_x = np.linalg.inv(Z.T @ Z) @ ((Z.T) @ X[:,index] )300x_est = Z @ beta_x301X[:,index] = x_est ## se reemplaza la variable x endógena por su estimado302beta_iv = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )303df = pd.DataFrame( {"OLS": beta , "OLS_IV" : beta_iv})304305return df306307#### Definida la función, podemos obtener los errores estándar de cada coeficiente, su p value y el intervalo de confianza.308ols(X,Y)309ols(X,Y,instrumento = z, index = 1)310print(ols(X,Y))311312313314315316317318319320