虚拟变量陷阱原理及算例

article/2025/11/3 7:05:52

文章目录

    • 1.虚拟变量
    • 2.虚拟变量陷阱
    • 3.虚拟变量陷阱例子及分析
    • 4.总结
    • 5.参考资料

1.虚拟变量

直接在回归模型中加入定性因素(比如类别因素:男或女)存在困难,因此可以考虑把定性因素量化,使定性因素与定量因素在回归模型中起到相同的作用。这时就用到了虚拟变量。

计量经济学中,把取值为0或者1的变量称为虚拟变量。例如用0表示女、1表示男。这样就把定性因素进行了量化。

2.虚拟变量陷阱

对于定性因素性别而言,它有两个水平——男和女,可以用一个虚拟变量x表示,x=1表示男,x=0表示女;也可以用两个虚拟变量x和y表示,x=1表示是男,x=0表示不是男,同理y=1表示女,y=0表示不是女。

若定性因素有m个互相排斥的属性(例如定性因素“性别”有m=2个相互排斥的属性——男和女):
(1)当回归模型有截距项时,只能引入m-1个虚拟变量,否则就会陷入“虚拟变量陷阱”;
(2)当回归模型无截距项时,可以引入m个虚拟变量。

3.虚拟变量陷阱例子及分析

下述例子中y是因变量,自变量有C1、C2、C3。

在这里插入图片描述
在有截距项b时,回归模型为
               y=a1×C1+a2×C2+a3×C3+b。
按上图中的虚拟变量设置,用OLS(ordinary least squares)求解方程的时候,模型解为
               [a1,a2,a3,b]’=invert((X’X))X’Y,
当有截距项b的并用时候,用上述公式求解模型就会遇到“虚拟变量陷阱”。

用上述公式求解回归模型的R语言代码如下:

##实验1:有截距项b+3个虚拟变量  【本实验报错】
##dv.csv为上述的表格
dv=read.csv('dv.csv')
Y=dv$y
X=cbind(dv[,c(1,2,3)],b=rep(1,6))
X=matrix(unlist(X),nrow=6)
solve(t(X)%*%X)

实验1报错,报错信息为:Error in solve.default(t(X)%*%X):Lapack例行程序dgesv:系统正好是奇异的:U[4,4]=0。

上述实验说明矩阵X’X是不可逆的。此时,有两种办法避免“虚拟变量陷阱”:去掉截距项b或者减少一个虚拟变量,改进代码如下:

##实验2:减少第一个虚拟变量
Y=dv$y
X=cbind(dv[,c(2,3)],b=rep(1,6))
X=matrix(unlist(X),nrow=6)
solve(t(X)%*%X)%*%t(X)%*%Y##实验3:去掉截距项b
Y=dv$y
X=cbind(dv[,c(1,2,3)])
X=matrix(unlist(X),nrow=6)
solve(t(X)%*%X)%*%t(X)%*%Y

上述两种方法都计算成功,当然系数是不一样。

4.总结

可以看到所谓“虚拟变量陷阱”的原因是:多重共线性导致OLS算法中矩阵不可逆。从而无法计算回归模型的系数。

“虚拟变量陷阱”是和回归模型的求解算法有关的,上述的OLS的闭式解会报错,但是可能用其他求解算法(比如梯度下降)还可以计算。

上述数据如果用Python的 sklearn.linear_model.LinearRegression(默认是有截距项b的),X={C1,C2,C3},Y={y},是不会报错的。但是用R中的线性回归函数lm时(参数也是X={C1,C2,C3},Y={y})计算出的一个系数是NA。用python解出的回归模型和用上述实验3计算出的模型实际结果几乎一样———6个数据点上的误差都是0或者8.881784e-16。二者对比代码如下:

import pandas as pd
from sklearn.linear_model import LinearRegressiondv=pd.read_csv('dv.csv')lr=LinearRegression()
lr.fit(X=dv.iloc[:,[0,1,2]],y=dv.iloc[:,3])
#sklearn———LinearRegression回归模型误差
error1=lr.coef_[0]*dv.iloc[:,0]+lr.coef_[1]*dv.iloc[:,1]+lr.coef_[2]*dv.iloc[:,2]+lr.intercept_-dv.iloc[:,3]
#上述实验3 回归模型误差,系数是从R计算结果copy过来的
error2=12.15*dv.iloc[:,0]+8.20*dv.iloc[:,1]+5.80*dv.iloc[:,2]-dv.iloc[:,3]
print(error1-error2)

5.参考资料

(1)本文的例子从下面这个资料里选的。这个资料讲的更清楚:
既有解释又有例子的一个文档
(2)这个ppt不错,前12页是解释虚拟变量的:
百度文库解释虚拟变量回归的一个文档


http://chatgpt.dhexx.cn/article/OBw3d3sJ.shtml

相关文章

机器学习(时间序列):线性回归之虚拟变量 dummy variables

1 前言 当预测变量是分类变量时,我们可以引入虚拟变量,作为回归的虚拟变量虚拟变量也可用于解释数据中的异常值。 虚拟变量不会忽略异常值,而是消除其影响。 在这种情况下,虚拟变量对该观察值取值为 1,而在其他任何正…

虚拟变量的方法介绍及python实现方式

虚拟变量的定义作用 计量经济学中对虚拟变量给出了定义、作用及使用场景,进一步的深入了解可以系统性学习。 定义:虚拟变量 ( Dummy Variables) ,用以反映无法定量度量的因素,譬如性别对收入的影响,是量化了的质变量&…

【计量经济学】虚拟变量

虚拟变量–潘登同学的计量经济学笔记 文章目录 虚拟变量--潘登同学的计量经济学笔记 对定性信息的描述只有一个虚拟变量的情形虚拟变量系数的解释虚拟变量的作用效果检验工资性别歧视因变量为对数形式的情况 多个虚拟变量的情形虚拟变量系数的解释使用虚拟变量包含序数信息虚拟…

php读取文件名称,php如何获取文件名

php获取文件名的方法&#xff1a;可以用basename()函数来获取文件名&#xff0c;例如&#xff1a;【basename($full_name)】。还可以使用pathinfo()函数来获取文件名。 PHP中获取文件名的方式 1、直接用basename&#xff1a;<?php $full_name c:\wamp\php\php.ini; $base…

python获取当前系统的日期_python怎么获取当前系统时间

python获取当前系统时间&#xff0c;包括年月日&#xff0c;时分秒&#xff0c;主要通过Python中的datetime模块来实现。 下面我们就通过具体的代码示例&#xff0c;给大家详细介绍Python获取当前时间日期的实现方法。 代码示例如下&#xff1a;import datetime now datetime.…

mysql如何获取当前时间_mysql怎么获取当前时间

mysql获取当前时间的方法&#xff1a;可以通过执行【select now();】语句来获取当前时间。还可以通过执行【select current_timestamp, current_timestamp();】语句来获取。 获得当前日期时间(date time)函数&#xff1a;now()mysql> select now(); --------------------- …

如何通过php获取今天的时间,如何使用php获取当前时间和日期

如何使用php获取当前时间和日期&#xff1f;在php中我们可以使用date()函数来获取当前时间和日期&#xff0c;也可以在PHP> 5.2的 版本中使用DateTime PHP类来获取日期和时间&#xff0c;下面我们就来看看具体的内容。 使用date()函数输出当前日期和时间。它将使用php.ini中…

php如何获取当前日期时间函数,php如何使用date()函数获取当前时间

php如何使用date()函数获取当前时间?本篇文章就给大家介绍具体介绍PHP使用date()函数获取当前时间的方法,希望对你们有所帮助。 date()函数可以将获取到的时间戳转换为更易读的日期和时间格式。当date()函数中不自定义一个时间戳时,将使用当前日期和时间。 下面我们来看看使…

PHP 获取当前访问的URL

<?php /** * 获取当前访问的完整url * return string * date 2020/7/23 */ function getUrl() {// 判断当前页采用的协议是HTTP还是HTTPS // 443端口&#xff1a;即网页浏览端口&#xff0c;主要用于HTTPS服务&#xff0c;是提供加密和通过安全端口传输的另一种HTTP。 $url…

python之点积

数学中点积也就是内积&#xff0c;是指两个向量各自对应位相乘后求和&#xff0c;比如x (x1,x2),y(y1,y2),则x与y的内积结果为x1*y1x2*y2,因此 python中一维数组之间的点积&#xff0c;即为数组各个位乘积之和&#xff0c;如&#xff1a; x1 np.arange(0,9) print(x1) y1 …

点积、叉积、内积、外积

点积、叉积、内积、外积 点积内积 &#xff08;结果标量&#xff09; 叉积外积 (结果矢量) 点积&#xff08;内积、数量积&#xff09;&#xff1a; matlab or python&#xff1a;dot() / np.dot() 数学符号&#xff1a;A.B<a,b> 相乘相加 物理意义&#xff1a; 向量…

点积和叉积在计算机图形学的应用

点积和叉积在计算机图形学中&#xff0c;是最为基础且重要的概念&#xff0c;初学者弄清它的概念的应用&#xff0c;是很重要的。最后一节&#xff0c;是为了加强理解记录&#xff0c;如果不看也是可以的&#xff0c;大家选择观看&#xff0c;有兴趣可以去看原视频&#xff0c;…

线性代数【18】点积和对偶性

前言&#xff1a; 本节&#xff0c;尝试通过线性变换来理解&#xff0c;或者说来表述点积。 在尝试理解的过程中&#xff0c;我们发现了线性变换&#xff0c;尤其是从多维空间到一维空间的线性变换&#xff0c;一定有某个严格的1x2的向量和他对应&#xff0c;这种微妙的而自然…

【Python】详解Numpy中的点积运算

1. 引言 根据数学家的说法&#xff0c;点积是一种运算&#xff0c;它取两个等长的向量作为输入&#xff0c;然后返回一个数字&#xff08;标量&#xff09;。向量A与向量B的点积用符号表示为A•B。在线性代数中&#xff0c;点积是输入向量中每个对应元素的乘积之和。 本文重点…

cuda点积运算

最近在研究并行运算的规约算法&#xff0c;在看《GPU高性能编程CUDA实战》这本书中点积运算时&#xff0c;有些问题想了很久&#xff0c;记录下来&#xff1b; 注点积公式&#xff1a;&#xff08;dot(A,B)a1*b1a2*b2...an*bn&#xff09; 书上例子算点积运算时分为了以下几步…

Unity3D C#数学系列之点积

文章目录 1 定义2 几何意义3 向量a向量b xaxbyaybzazb4 应用案例4.1 求两向量的夹角4.2 判断两向量是否垂直4.3 判断NPC是否在攻击范围内4.4 已知入射光线和表面法线求反射光线 5 项目 1 定义 可知&#xff0c;点积得到的是一个标量&#xff0c;这个标量代表什么呢&#xff1f…

内积、点积和坐标

内积是一个纯数学概念&#xff0c;在向量空间中&#xff0c;只要满足一定的性质&#xff08;正性、定性、可加性、齐性和共轭对称性&#xff09;的函数运算就可以成为内积&#xff0c;因此具体的内积具有很多种形式。 点积是定义在空间上的一种内积&#xff0c;具体的形式为&am…

点积与投影的关系

点积与投影的关系 一个向量在另一个单位向量上的投影长度&#xff0c;等于这两个向量的点积。 怎么理解 a、b、c分别为三个向量&#xff0c;如果有abc&#xff0c;那么c在某个向量上的投影值等于a和b分别在该向量上的投影值相加(反方向的投影为负值) i&#xff0c;j分别是向…

防抖与节流的个人理解及其对应的应用场景

什么是防抖和节流&#xff0c;他们的应用场景有哪些 防抖 (debounce) 防抖&#xff0c;顾名思义&#xff0c;防止抖动&#xff0c;以免把一次事件误认为多次&#xff0c;敲键盘就是一个每天都会接触到的防抖操作。 想要了解一个概念&#xff0c;必先了解概念所应用的场景。在…

JS防抖和节流

欢迎学习交流&#xff01;&#xff01;&#xff01; 持续更新中… 文章目录 防抖节流二者区别应用场景 防抖和节流都是为了项目优化而出现的&#xff0c;官方没有具体定义的&#xff0c;他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等…