获取glm()中所有变量的P值

时间:2019-03-13 09:29:47

标签: r glm frequency-analysis model.matrix

我知道这是一个众所周知的经典问题,但是尽管我进行了研究,但仍无法通过数据解决此问题。

我有这种数据:

df

                         SNP Site  Color Frequence
1  scaffold10000|size69197_10061    K  Green 0.4404348
2  scaffold10000|size69197_10061    G  Green 0.6700000
3  scaffold10000|size69197_10061    G    Red 0.7171429
4  scaffold10000|size69197_10061    K Yellow 0.7937500
5  scaffold10000|size69197_10061    T Yellow 0.7202174
6  scaffold10000|size69197_10061    E    Red 0.7373469
7  scaffold10000|size69197_10061    G Yellow 0.6150000
8  scaffold10000|size69197_10061    T    Red 0.5668750
9  scaffold10000|size69197_10061    K    Red 0.6190385
10 scaffold10000|size69197_10061    T  Green 0.5629412
11 scaffold10000|size69197_10061    E Yellow 0.8312500
12 scaffold10000|size69197_10061    E  Green 0.5474286

我想知道此SNP的三种颜色和四个位置之间是否存在统计差异(命名为“ scaffold10000 | size69197_10061”)。 我想考虑这些变量(3种颜色和4个位置),这就是为什么我选择glm()函数。

model <- glm(formula = Frequence  ~  Color  + Site, family=quasibinomial(), data=df) 

这给了我这些系数:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.2905     0.3105   0.936   0.3856  
ColorRed      0.4450     0.3084   1.443   0.1991  
ColorYellow   0.8298     0.3215   2.581   0.0417 *
SiteT        -0.2268     0.3644  -0.622   0.5566  
SiteK        -0.2221     0.3645  -0.609   0.5646  
SiteE         0.1809     0.3760   0.481   0.6475  
---

因此,绿色和G站点不会出现(因为如果我正确理解的话,它们都是绝对的)。

根据R bloggerStackoverflow中的这些问题,我了解了如何在添加-1+ 0的过程中删除截距(使模型更易于理解)。公式。

model <- glm(formula = Frequence  ~  Color  + Site - 1, family=quasibinomial(), data=df) 

因此,我至少出现了一个类别变量:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
ColorGreen    0.2905     0.3105   0.936   0.3856  
ColorRed      0.7355     0.3185   2.309   0.0603 .
ColorYellow   1.1202     0.3319   3.376   0.0149 *
SiteT        -0.2268     0.3644  -0.622   0.5566  
SiteK        -0.2221     0.3645  -0.609   0.5646  
SiteE         0.1809     0.3760   0.481   0.6475  

为了使第4个网站出现,我未能对某些内容进行编码

首先,我尝试合并2种不同的模型:

model1 <- glm(formula = Frequence  ~  Site - 1, family=quasibinomial(), data=df) 
model2 <- glm(formula = Frequence  ~  Color - 1, family=quasibinomial(), data=df) 

用不同的方式,但是没有用(也许没有意义。.)

放置其他-1+ 0都不起作用:

model <- glm(formula = Frequence  ~  0 + Color  + Site - 1, family=quasibinomial(), data=df) 

根据对此similar issue(以及关于lm()的{​​{3}})的答案,只需在参数上添加两个总和为零的约束即可:

contrasts(ok$Site) <- contr.sum(4, contrasts=F)
contrasts(ok$Color) <- contr.sum(3, contrasts=F)

或使用它(我不记得Stackoverflow的每个脚步了)

relevel(ok$Site, "E")
relevel(ok$Site, "T")
relevel(ok$Site, "K")
relevel(ok$Site, "G")

,然后重新运行模型。但是这两种可能性也失败了。

因此,我尝试拆分data.frame,以便将变量手动添加到模型中:

df2
                              SNP Site  Color Frequence Green Yellow   Red     K     G     T     E
 1  scaffold10000|size69197_10061    K  Green 0.4404348  TRUE  FALSE FALSE  TRUE FALSE FALSE FALSE
 2  scaffold10000|size69197_10061    G  Green 0.6700000  TRUE  FALSE FALSE FALSE  TRUE FALSE FALSE
 3  scaffold10000|size69197_10061    G    Red 0.7171429 FALSE  FALSE  TRUE FALSE  TRUE FALSE FALSE
 4  scaffold10000|size69197_10061    K Yellow 0.7937500 FALSE   TRUE FALSE  TRUE FALSE FALSE FALSE
 5  scaffold10000|size69197_10061    T Yellow 0.7202174 FALSE   TRUE FALSE FALSE FALSE  TRUE FALSE
 6  scaffold10000|size69197_10061    E    Red 0.7373469 FALSE  FALSE  TRUE FALSE FALSE FALSE  TRUE
 7  scaffold10000|size69197_10061    G Yellow 0.6150000 FALSE   TRUE FALSE FALSE  TRUE FALSE FALSE
 8  scaffold10000|size69197_10061    T    Red 0.5668750 FALSE  FALSE  TRUE FALSE FALSE  TRUE FALSE
 9  scaffold10000|size69197_10061    K    Red 0.6190385 FALSE  FALSE  TRUE  TRUE FALSE FALSE FALSE
 10 scaffold10000|size69197_10061    T  Green 0.5629412  TRUE  FALSE FALSE FALSE FALSE  TRUE FALSE
 11 scaffold10000|size69197_10061    E Yellow 0.8312500 FALSE   TRUE FALSE FALSE FALSE FALSE  TRUE
 12 scaffold10000|size69197_10061    E  Green 0.5474286  TRUE  FALSE FALSE FALSE FALSE FALSE  TRUE

(可以使用df2[df2=="FALSE"]<-0将TRUE和FALSE更改为0和1。

  model <- glm(formula=Frequence  ~  Red + Green + Yellow + K + T + E + G -1, family=quasibinomial(), data=df2)

现在,所有变量都在系数中:

Coefficients: (2 not defined because of singularities)
           Estimate Std. Error t value Pr(>|t|)  
RedFALSE     1.1202     0.3319   3.376   0.0149 *
RedTRUE      0.7355     0.3185   2.309   0.0603 .
GreenTRUE   -0.8298     0.3215  -2.581   0.0417 *
YellowTRUE       NA         NA      NA       NA  
KTRUE       -0.2221     0.3645  -0.609   0.5646  
TTRUE       -0.2268     0.3644  -0.622   0.5566  
ETRUE        0.1809     0.3760   0.481   0.6475  
GTRUE            NA         NA      NA       NA 

但是现在出现NA

根据this中的这个问题,我检查了模型矩阵是否具有完整等级,答案是否定的。

# Get model matrix ...
X <- model.matrix(~ Red + Green + Yellow + K  + T + E + G - 1, family=quasibinomial(), data=as.data.frame(ok))
> X
   RedFALSE RedTRUE GreenTRUE YellowTRUE KTRUE TTRUE ETRUE GTRUE
1         1       0         1          0     1     0     0     0
2         1       0         1          0     0     0     0     1
3         0       1         0          0     0     0     0     1
4         1       0         0          1     1     0     0     0
5         1       0         0          1     0     1     0     0
6         0       1         0          0     0     0     1     0
7         1       0         0          1     0     0     0     1
8         0       1         0          0     0     1     0     0
9         0       1         0          0     1     0     0     0
10        1       0         1          0     0     1     0     0
11        1       0         0          1     0     0     1     0
12        1       0         1          0     0     0     1     0


# Get rank of model matrix
qr(X)$rank
> 6


# Get number of parameters of the model = number of columns of model matrix
ncol(X)
> 8

因此,如果没有-1,则X的第一列是截距,如果有-1,则红色列是重复的(一个代表TRUE,另一个代表FALSE)

因此,有8列和6级。 通常我应该有14列而不是14列? (7个变量(3种颜色和4个位置)* 2(是或否))

那么,我该如何编码我的模型以强制获取所有变量的Pvalues?

任何以适当方式对此进行编程的建议,将不胜感激。

0 个答案:

没有答案