首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >R总是返回NA作为一个系数,作为线性回归与不必要的变量的结果?

R总是返回NA作为一个系数,作为线性回归与不必要的变量的结果?
EN

Stack Overflow用户
提问于 2017-06-23 04:22:16
回答 2查看 3.3K关注 0票数 5

我的问题是关于不必要的预测器,即不提供任何新的线性信息的变量,或者是其他预测器的线性组合的变量。如您所见,swiss数据集有六个变量。

代码语言:javascript
运行
AI代码解释
复制
library(swiss)
names(swiss)
# "Fertility"        "Agriculture"      "Examination"      "Education"        
# "Catholic"      "Infant.Mortality"

现在我介绍一个新的变量ec。它是ExaminationEducation的线性组合。

代码语言:javascript
运行
AI代码解释
复制
ec <- swiss$Examination + swiss$Catholic

当我们运行一个带有不必要变量的线性回归时,R会删除其他项的线性组合,并返回NA作为它们的系数。下面的命令完美地说明了这一点。

代码语言:javascript
运行
AI代码解释
复制
lm(Fertility ~ . + ec, swiss)

Coefficients:
 (Intercept)       Agriculture       Examination         Education            
     66.9152           -0.1721           -0.2580           -0.8709 

Catholic  Infant.Mortality    ec

  0.1041            1.0770    NA

但是,当我们首先在ec上回归时,然后所有的回归器,如下所示,

代码语言:javascript
运行
AI代码解释
复制
lm(Fertility ~ ec + ., swiss)

 Coefficients:
 (Intercept)                ec       Agriculture       Examination           
     66.9152            0.1041           -0.1721           -0.3621           
  Education          Catholic     Infant.Mortality  
    -0.8709                NA            1.0770  

我希望CatholicExamination的系数都是NA。变量ec是两者的线性组合,但最终Examination系数不是NACatholic系数是NA

有人能解释一下原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 04:27:34

会有NA吗?

是。添加这些列不会扩大列空间。得到的矩阵是秩亏的.

多少NA

这取决于数字的等级。

代码语言:javascript
运行
AI代码解释
复制
number of NA = number of coefficients - rank of model matrix

在您的示例中,在引入ec之后,将有一个NA。更改模型公式中协变量的规格顺序实质上是对模型矩阵进行列改组。这不会改变矩阵的排序,因此无论您的规范顺序如何,您总是只得到一个NA

好的,但是哪一个是NA

lm使用限制的列旋转进行LINPACK QR分解。协变量的顺序影响到哪一个是NA。一般来说,“先到先得”的原则是成立的,NA的地位是相当可预测的。以你的例子为例。在第一个规范中,这些协线性项以ExaminationCatholicec顺序出现,因此第三个ec具有NA系数。在第二个规范中,这些术语以ecExaminationCatholic顺序显示,第三个Catholic具有NA系数。请注意,系数估计并不是不变量的规格顺序,虽然拟合的值是不变的。

如果采用完全列旋转的LAPACK分解,则系数估计将不受规范阶的影响。然而,NA的位置并不像在LINPACK情况下那样可预测,它完全是由数字决定的。

数值算例

mgcv包中实现了基于LAPACK的QR分解。当使用REML估计时,检测数值秩,不可识别系数报告为0(而不是NA)。因此,我们可以比较lmgam / bam在线性模型估计中的应用。让我们首先构建一个玩具数据集。

代码语言:javascript
运行
AI代码解释
复制
set.seed(0)

# an initial full rank matrix
X <- matrix(runif(500 * 10), 500)
# make the last column as a random linear combination of previous 9 columns
X[, 10] <- X[, -10] %*% runif(9)

# a random response
Y <- rnorm(500)

现在我们对X的列进行洗牌,看看NAlm估计下是否改变了它的位置,或者0是否改变了它在gambam估计下的位置。

代码语言:javascript
运行
AI代码解释
复制
test <- function (fun = lm, seed = 0, ...) {
  shuffleFit <- function (fun) {
    shuffle <- sample.int(ncol(X))
    Xs <- X[, shuffle]
    b <- unname(coef(fun(Y ~ Xs, ...)))
    back <- order(shuffle)
    c(b[1], b[-1][back])
    }
  set.seed(seed)
  oo <- t(replicate(10, shuffleFit(fun)))
  colnames(oo) <- c("intercept", paste0("X", 1:ncol(X)))
  oo
  }

首先我们要检查一下lm

代码语言:javascript
运行
AI代码解释
复制
test(fun = lm)

我们看到NA随着X的列洗牌而改变它的位置。估计系数也不同。

现在我们来检查一下gam

代码语言:javascript
运行
AI代码解释
复制
library(mgcv)
test(fun = gam, method = "REML")

我们发现,估计对X的列改组是不变的,而X5的系数总是0。

最后,我们检查bam (对于像这里这样的小数据集,bam是慢的。它是为大型或超大型数据集设计的。因此,以下内容明显较慢)。

代码语言:javascript
运行
AI代码解释
复制
test(fun = bam, gc.level = -1)

其结果与我们对gam的看法相同。

票数 5
EN

Stack Overflow用户

发布于 2017-06-23 04:36:29

ec检测和是3个参数,需要至少2个变量来确定第三个。重要的是,每三个中有2个是必需的。现在,当你把这个传递给lm时,3个相关变量中的前两个将得到系数,第三个变量将以NA结束。变量的顺序很重要。我希望这解释了考试和天主教两者都不是NA的原因。只有电子商务,你不能同时决定考试和天主教。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44721341

复制
相关文章
R语言:以多列标准筛选特定行
在本期,我们会运用一个病例数据为大家进行讲解示范,这也是大猫课堂第一次针对阅读者提问进行的反馈,也希望大家能提供一些有趣的问题,来和我们一起分享,同时也感谢读者孤鹜惜秋,与我们分享其问题。话不多说,马上进入正题。
用户7652506
2020/08/12
2K0
R语言:以多列标准筛选特定行
python创建与遍历List二维列表
python 创建List二维列表 lists = [[] for i in range(3)] # 创建的是多行三列的二维列表 for i in range(3): lists[0].append(i) for i in range(5): lists[1].append(i) for i in range(7): lists[2].append(i) print("lists is:", lists) # lists is: [[0, 1, 2], [0, 1, 2, 3,
演化计算与人工智能
2020/08/14
2.4K0
【Python】列表 List ⑦ ( 列表遍历 | 使用 while 循环遍历列表 | 使用 for 循环遍历列表 | while 循环 与 for 循环对比 )
将 列表 容器 中的数据元素 , 依次逐个取出进行处理的操作 , 称为 列表的遍历 ;
韩曙亮
2023/10/11
9810
列表:创建列表
列表是Tcl语言中最重要的一种数据结构。什么是列表?列表是元素的有序集合,各个元素可以包含任何字符串,例如空格,反斜杠,换行符等。列表表现为特定结构的字符串,这意味着可以把它们赋值给一个变量,可以把它们做为参数传给命令,可以把它们嵌套到其他列表中。
Lauren的FPGA
2019/10/30
2.4K0
R语言入门之创建新的变量
‍‍今天,米老鼠想和大家聊聊如何在R中创建新的变量。‍‍一般‍‍‍‍‍‍‍‍‍‍我们可以使用赋值符号 <- 来在数据中创建新的变量。下面我主要介绍三种创建新变量的基本方法
生信与临床
2020/08/06
2.5K0
R语言 数据框、矩阵、列表的创建、修改、导出
数据框来源主要包括用代码新建(data.frame),由已有数据转换或处理得到(取子集、运算、合并等操作),读取表格文件(read.csv,read.table等)及R语言内置数据
Magnolia
2023/01/06
8K0
python 的列表遍历删除
python的列表list可以用for循环进行遍历,实际开发中发现一个问题,就是遍历的时候删除会出错,例如
py3study
2020/01/07
2.4K0
【动手实践】Oracle 12.2新特性:多列列表分区和外部表分区
在Oracle 12.2版本中,增加了大量的分区新特性,这其中包括: 自动的列表分区创建 在线的普通表转换分区表 支持只读分区和读写分区混合 以下介绍的三个特性同样是12.2新增的: 多列列表分区、外部表分区、维护过滤 而对于多列列表分区的支持,也是大家关注已久的特性,先看一下脚本(在 livesql.oracle.com 测试执行,推荐动手实践): CREATE TABLE dba_by_db_in_yhem (dbalic NUMBER, username
数据和云
2018/03/06
1.1K0
【动手实践】Oracle 12.2新特性:多列列表分区和外部表分区
【动手实践】Oracle 12.2 新特性:自动的列表分区创建
2017年来了,我们要启动新的学习征程了。在过去我们一直思考,什么样的内容能够更帮助大家了解和学习到有用的知识? 这个『动手实践』栏目就是这样一个改进和尝试吧,一个小小的范例,几分钟的线上实践(感谢Oracle),就能帮助大家熟悉一个知识点,几个重要的命令。如此是否会有不一样的体验?试一试吧。 ---- 在Oracle Database 12.2 之前,如果使用列表分区,当插入的数据超过了分区列表值设定,则会抛出异常;而如果存在大量的列表值需要定义,则可能需要一一设置。 在12.2引入的新特性中 - Au
数据和云
2018/03/06
1.2K0
【动手实践】Oracle 12.2 新特性:自动的列表分区创建
SharePoint2010新特性:InfoPath定义创建列表的界面
在SharePoint2007的时候,自定义的列表可以使用CAML修改其展示页面,但是对于创建列表的页面,不容易自定义。现在在SharePoint2010中,增强了InfoPath Form Services,我们可以使用InfoPath Designer来快速设置自定义列表的修改和展示页面。
深蓝studyzy
2022/06/16
7200
SharePoint2010新特性:InfoPath定义创建列表的界面
[Excel技巧]创建下拉列表
在单位用Excel做统计,想偷个小懒,比如食品一栏。能不能设计一个下拉列表,直接在列表框中选择,省去键盘的重复输入呢?
卷福同学
2023/04/28
2.3K0
[Excel技巧]创建下拉列表
Ordering列以或更好性能
为减少数据库的存储空间,需要确保对列进行排序,通常最好先放置固定大小的列,然后再添加可变长度的列。
yzsDBA
2021/04/26
3210
Bash遍历字符串列表
大家知道,通过python可以很容易实现各类数据结构,例如列表。但在bash中,实现一个列表相对来说会比较复杂。
zero000
2021/03/23
7.1K0
Bash遍历字符串列表
python基础之列表的遍历
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python列表的遍历相关知识。
jiankang666
2022/06/22
1K0
python基础之列表的遍历
SharePoint 2010 新列表模板列表
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117742.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
7160
SharePoint 2010 新列表模板列表
python for循环如何遍历多个数组 和 遍历list(列表)
i = [1,2,3] o = [4,5,6] for i2,o2 in zip(i,o): print i2,o2 结果: 1 4 2 5 3 6 字典: i = {"1":"123","2":"abc"} o = {"3":"456","4":"def"} for k,v in zip(i,o): print i[k],o[v] 结果: 123 456 abc def =======遍历List======= list = ['html', 'js', 'css', 'p
简单、
2018/07/18
9.7K0
Python创建数字列表
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 10 1 sum is : 55
py3study
2020/01/03
1.3K0
点击加载更多

相似问题

循环遍历R中的列名以创建新列

20

循环遍历列以在R中创建新表

22

循环遍历dataframe以创建新的数据格式

15

遍历多个列以创建新变量

11

如何遍历多个列以创建多个新列。

414
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文