Path: blob/main/Trabajo_grupal/WG1/Grupo_9_py.py
2714 views
# -*- coding: utf-8 -*-1"""2Trabajo Grupal_934"""5#Importar galerias6import numpy as np7import pandas as pd8import random9from scipy.stats import t1011#1.############################################################################12def function1(x):13for i in x:14if i in range(0,101):15print(np.sqrt(i))1617elif i in range(101,301):18print(i-5)1920elif i >300:21print(50)2223#generar vector con numeros del 0 a 500 y con talla del vector de 20 datos24A=np.random.randint(0,501,20)25#aplicar la funcion creada26function1(A)272829#2.############################################################################30def fescalar(M: np.ndarray,est = True): #condicionar a que sea vector o matriz3132if not isinstance( M , np.ndarray ) :33raise TypeError( "Error: el tipo de variable no es un vector o matriz.")3435elif est is False:3637Z = np.zeros((M.shape[0], M.shape[1]))38for i in range(M.shape[1]):39a = np.ndarray.min(M[:,i])40b = np.ndarray.max(M[:,i])41Z[:,i] = np.around((M[:,i]-a)/(b-a),2)4243return Z4445elif est is True:46Z = np.zeros(M.shape[0])47for i in range(M.shape[0]):48a = np.ndarray.min(M)49b = np.ndarray.max(M)50Z[i] = round((M[i]-a)/(b-a),2)5152return Z535455#Caso matriz:56B=np.random.randint(1,100, size=(100,50))57print(fescalar(B, est=False))5859#Caso vector:60C=np.random.randint(1,101,100)61print(fescalar(C, est=True))62636465#3.############################################################################66#Y, Proceso generador de datos con 5 variables (1 + x1 + x2 + x3 + x4 )6768np.random.seed(170) #semilla6970x1 = np.random.rand(10000) #uniforme distribucion71x2 = np.random.rand(10000)72x3 = np.random.rand(10000)73x4 = np.random.rand(10000)74x5 = np.random.rand(10000)75e = np.random.normal(0,1,10000) # normal distribution767778Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + e79print(Y.size) #10 mil observaciones8081#Informacion omitiendo una variable x482mat = np.column_stack((Y, np.ones(10000),x1,x2,x3))8384muestra = (10, 50, 80 , 120 , 200, 500, 800, 1000, 5000)8586for m in muestra:8788elegidos=random.sample(range(10000), m) #vector de indices de las posiciones de las observaciones elegidos en la muestra89observ= mat[elegidos,:] #matriz con observaciones elegidas9091#vector de X92X = observ[:,1:]93#vector de Y94Y = observ[:,0]9596#1. Construir beta97beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )98beta99100#2. Error estandar101y_est = X @ beta #2.b. Y estimado = vector102103n = X.shape[0] #2.c. numero de observaciones104105k = X.shape[1] - 1 #2.d. x - unos106107nk = n - k #2.e. grados de libertad108109sigma2 = sum(list( map( lambda x: x**2 , Y - y_est) )) / nk #2.f. SCR/ (n-k) = e'e /(n-k) = s^2 =sigma^2110111Var = sigma2*np.linalg.inv(X.T @ X) #2.g. Var_Cov(betas) = s^2 * (X'X)-1112113sd = np.sqrt( np.diag(Var) ) #2.h. desv(betas)=var(betas)^(1/2)114115#3. Tamano de la muestra m116tamano=np.ones(len(beta))*m # se crea vector para colocarlo en la tabla117118119df = pd.DataFrame( {"Muestra_tamano": tamano, "OLS": beta , "standar_error" : sd })120print(df)121122#4.123# Y, proceso generador de datos con 8 variables124125np.random.seed(170)126127x1 = np.random.rand(800)128x2 = np.random.rand(800)129x3 = np.random.rand(800)130x4 = np.random.rand(800)131x5 = np.random.rand(800)132x6 = np.random.rand(800)133x7 = np.random.rand(800)134e = np.random.normal(0,1,800) # normal distribution135136Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + 2*x5 + 3*x6 + 1.5*x7 + e137print(Y.size) #800 observaciones138139X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))140X141142#1. Definir funcion143#Incluye,144#argumento de que incluye intercepto por default145#argumento de heterocedasticidad (es homocedastico por default)146147def ols(M,Y, inter=True, homo=True):148149#2. Estimaciones150#Beta151beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y ) #2.a. estimar beta152153y_est = X @ beta #2.b. Y estimado y Y media154y_mean=np.mean(Y)155156n = X.shape[0] #2.c. numero de observaciones157k = X.shape[1] - 1 #2.d. numeros de x - unos158nk = n - k #2.e. grados de libertad159160ee= list( map( lambda x: x**2 , Y - y_est)) #2.f. Vector de residuos^2161162SCR = sum(ee) #2.g. Sumatoria Cuadrado de Residuos163SCT = sum(list( map( lambda x: x**2 , Y - y_mean))) #2.h. Sumatoria Cuadrados Totales164165# Root-MSE166root_mse = np.sqrt(SCR/ n)167168# R cuadrado169R_cuadrado = 1- SCR/SCT170171diccionario = {'R2': R_cuadrado ,'Rootmse': root_mse }172173if inter and homo:174175sigma2 = SCR / nk #2.f. SCR/ (n-k) = e'e /(n-k) = s^2176177Var = sigma2*np.linalg.inv(X.T @ X) #2.g. Var_Cov(betas) = s^2 * (X'X)-1178179sd = np.sqrt( np.diag(Var) ) #2.h. desv(betas)=var(betas)^1/2 , solo diag180181t_est = np.absolute(beta/sd) #2.i. t_est = |beta-0|/sd ==> para cada beta182183pvalue= (1 - t.cdf(t_est, df=nk) ) * 2 #2.j. p_value ==> para cada beta184185superior= beta + 1.96 * sd #2.h. límites186inferior= beta - 1.96 * sd187188df = pd.DataFrame( {"Estimacion_OLS": beta , "standar_error" : sd , "Pvalue" : pvalue, "Limit_sup": superior, "Limit_inf": inferior})189190elif inter and (homo is False):191192White= np.eye(n)*ee #2.a. Matriz de corrección de White193194VarCorg=np.linalg.inv(X.T @ X) @ X.T @White @ X @ np.linalg.inv(X.T@X) #2.g. Var_Cov(betas) corregida195196sd = np.sqrt( np.diag(VarCorg) ) #2.h. desv(betas)=var(betas)^1/2 , solo diag197198t_est = np.absolute(beta/sd) #2.i. t_est =|beta-0|/sd ==> para cada beta199200pvalue= (1 - t.cdf(t_est, df=nk) ) * 2 #2.j. p_value ==> para cada beta201202superior= beta + 1.96 * sd #2.h limites203inferior= beta - 1.96 * sd204205df = pd.DataFrame( {"Estimacion_OLS": beta , "standar_error" : sd , "Pvalue" : pvalue, "Limit_sup": superior, "Limit_inf": inferior})206207print(df, "\n", diccionario)208209210211#Caso homocedastico212ols(X,Y)213214#Caso heterocedastico215ols(X,Y,homo=False)216#Cuando hay heterocedasticidad, la varianza modificada afecta el error estandar, pvalue, limites.217#No cambia los R2 y Rootmse pues solo explican como los betas estimados ajustan la linea de regresion,218#y con la matriz de white los betas no han cambiado.219220221222223224225226227228229230