首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的线性模型不适合

R中的线性模型不适合
EN

Stack Overflow用户
提问于 2020-05-09 14:40:05
回答 2查看 152关注 0票数 1

我知道标题没有具体说明我的意思,所以让我在这里解释一下。我处理一个数据集,其中包括给定某种小麦类型(A、B、C、D)的小麦产量。现在,我在拟合线性模型时的问题是,我试图拟合:

lm1 = lm(yield ~ type)在这样做时,R提交了第一个小麦类型(A),并将其标记为全局截距,然后估计所有其他类型对产量的影响。我知道我可以拟合这样的线性模型:lm2 = lm(yield ~ 0 + type),它将给我估计每种类型对产量的影响,但是我真正想看到的是两者的结合。

在R s.t lm3 = lm(yield ~ GlobalIntercept + type)中,是否有一种方法可以拟合线性模型,其中GlobalIntercept表示线性模型的一般截距,然后我可以看到每种类型的小麦对一般截距的影响。在第一个模型中,我们估计了所有类型的小麦(A,B,C,D)对一般产量的影响。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-09 15:54:00

向SO提出的问题应该包括最少可重复的示例数据--参见R标记页顶部的说明。由于问题没有包括这一点,所以这次我们将使用随R一起内置的InsectSprays数据集来提供。

以下是几种方法:

1) lm/cor.sum/dumy.coef尝试使用contr.sum和-0对spray因子的对比度,并查看虚拟系数。这将扩展系数以包括本例中spray因子的所有6个级别:

代码语言:javascript
复制
fm <- lm(count ~ spray, InsectSprays, contrasts = list(spray = contr.sum))
dummy.coef(fm)
## Full coefficients are 
##                                                                           
## (Intercept):          9.5                                                  
## spray:                  A         B         C         D         E         F
##                  5.000000  5.833333 -7.416667 -4.583333 -6.000000  7.166667

sum(dummy.coef(fm)$spray)  # check that coefs sum to zero
## [1] 0

2)如果每个级别在数据集中有相同的行数(如InsectSprays,每个级别有12行),那么我们可以取每个级别的平均值,然后减去Intercept (这是总体平均值)。如果数据集是不平衡的,即如果不同级别有不同的行数,则这不起作用。注意下面的计算如何给出与(1)相同的结果。

代码语言:javascript
复制
mean(InsectSprays$count)  # intercept
## [1] 9.5

with(InsectSprays, tapply(count, spray, mean) - mean(count))
##         A         B         C         D         E         F 
##  5.000000  5.833333 -7.416667 -4.583333 -6.000000  7.166667 

3) aov/表我们也可以在model.tables中使用aov,如下所示:

代码语言:javascript
复制
fm2 <- aov(count ~ spray, InsectSprays)
model.tables(fm2)
## Tables of effects
##
##  spray 
## spray
##      A      B      C      D      E      F 
##  5.000  5.833 -7.417 -4.583 -6.000  7.167 

model.tables(fm2, type = "means")
## Tables of means
## Grand mean
##    
## 9.5 
##
##  spray 
## spray
##      A      B      C      D      E      F 
## 14.500 15.333  2.083  4.917  3.500 16.667 

4)的意思是,我们可以使用lm,后面跟着can,如下所示:

代码语言:javascript
复制
library(emmeans)

fm <- lm(count ~ spray, InsectSprays)
emmeans(fm, "spray")
##  spray emmean   SE df lower.CL upper.CL
##  A      14.50 1.13 66   12.240    16.76
##  B      15.33 1.13 66   13.073    17.59
##  C       2.08 1.13 66   -0.177     4.34
##  D       4.92 1.13 66    2.656     7.18
##  E       3.50 1.13 66    1.240     5.76
##  F      16.67 1.13 66   14.406    18.93
##
## Confidence level used: 0.95 
票数 3
EN

Stack Overflow用户

发布于 2020-05-09 15:00:04

根据您提供的信息,我可以推断您是将产量建模为一个线性函数类型,它有四个类别。您的期望是在每种类型的系数之外有一个截距。这没道理。

你是根据名义变量预测收益的。如果您想要具有带有截距的回归,则需要有带有原点的预测变量。一个标称变量的性质是它没有起源。原点意味着预测器的零值。标称变量不能有原点。换句话说,截距(带有一个连续的预测变量)意味着因变量y的值,当预测值为零时(在您的例子中,类型的类别是零,这实际上是不可能的)。这就是为什么您的模型将其中一个类别作为引用类别并计算其截获信息的原因。当该范畴与参考范畴不同时,y变量的变化由系数给出。

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

https://stackoverflow.com/questions/61698475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档