如何使用 glm() 函数?

How do I use the glm() function?

我正在尝试使用 R 在我的数据上拟合一般线性模型 (GLM)。我有一个 Y 连续变量和两个分类因子 A 和 B。每个因子都编码为 0 或 1,表示存在或缺席。

即使只看数据我也看到了 A 和 B 之间的明显交互,GLM 表示 p 值>>>0.05。我做错了什么吗?

首先,我创建了包含 GLM 数据的数据框,它由一个 Y 因变量和两个因子 A 和 B 组成。这是两个水平因子(0 和 1)。每个组合有 3 个重复。

A<-c(0,0,0,1,1,1,0,0,0,1,1,1)
B<-c(0,0,0,0,0,0,1,1,1,1,1,1)
Y<-c(0.90,0.87,0.93,0.85,0.98,0.96,0.56,0.58,0.59,0.02,0.03,0.04)
my_data<-data.frame(A,B,Y)

让我们看看它的样子:

my_data
##    A B    Y
## 1  0 0 0.90
## 2  0 0 0.87
## 3  0 0 0.93
## 4  1 0 0.85
## 5  1 0 0.98
## 6  1 0 0.96
## 7  0 1 0.56
## 8  0 1 0.58
## 9  0 1 0.59
## 10 1 1 0.02
## 11 1 1 0.03
## 12 1 1 0.04

正如我们仅查看数据所见,因素 A 和因素 B 之间存在明显的相互作用,因为当存在 A 和 B 时(即 A=1 和 B=1),Y 的值会急剧下降).但是,使用 glm 函数,我在 A 和 B 之间没有明显的交互作用,因为 p 值>>>0.05

attach(my_data)
## The following objects are masked _by_ .GlobalEnv:
## 
##     A, B, Y


my_glm<-glm(Y~A+B+A*B,data=my_data,family=binomial)
## Warning: non-integer #successes in a binomial glm!
summary(my_glm)
## 
## Call:
## glm(formula = Y ~ A + B + A * B, family = binomial, data = my_data)
## 
## Deviance Residuals: 
##       Min         1Q     Median         3Q        Max  
## -0.275191  -0.040838   0.003374   0.068165   0.229196  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   2.1972     1.9245   1.142    0.254
## A             0.3895     2.9705   0.131    0.896
## B            -1.8881     2.2515  -0.839    0.402
## A:B          -4.1747     4.6523  -0.897    0.370
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 7.86365  on 11  degrees of freedom
## Residual deviance: 0.17364  on  8  degrees of freedom
## AIC: 12.553
## 
## Number of Fisher Scoring iterations: 6

family=binomial 表示 Logit (Logistic) 回归,它本身会产生二元结果。

来自Quick-R

Logistic Regression

Logistic regression is useful when you are predicting a binary outcome from a set of continuous predictor variables. It is frequently preferred over discriminant function analysis because of its less restrictive assumptions.

数据显示互动。尝试适应不同的模型,logistic 是不合适的。

with(my_data, interaction.plot(A, B, Y, fixed = TRUE, col = 2:3, type = "l"))

方差分析显示所有因素和交互作用的显着性。

fit <- aov(Y~(A*B),data=my_data)
summary(fit)
            Df Sum Sq Mean Sq F value   Pr(>F)    
A            1 0.2002  0.2002   130.6 3.11e-06 ***
B            1 1.1224  1.1224   732.0 3.75e-09 ***
A:B          1 0.2494  0.2494   162.7 1.35e-06 ***
Residuals    8 0.0123  0.0015                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

虽然您说 Y 是连续的,但数据显示 Y 是一个分数。因此,这可能是您首先尝试申请 GLM 的原因。

如果满足某些假设,则可以使用逻辑回归来对分数(即以 0 和 1 为界的连续值)进行建模。有关详细信息,请参阅以下交叉验证 post:https://stats.stackexchange.com/questions/26762/how-to-do-logistic-regression-in-r-when-outcome-is-fractional。然而,从数据描述来看,并不清楚这些假设是否满足。

分数模型的替代方法是 beta 回归或分数响应模型。

请参阅下文了解如何将这些方法应用于您的数据。两种方法的结果在符号和显着性上是一致的。

# Beta regression
install.packages("betareg")
library("betareg")
result.betareg <-betareg(Y~A+B+A*B,data=my_data)
summary(result.betareg)

# Call:
#   betareg(formula = Y ~ A + B + A * B, data = my_data)
# 
# Standardized weighted residuals 2:
#   Min      1Q  Median      3Q     Max 
# -2.7073 -0.4227  0.0682  0.5574  2.1586 
# 
# Coefficients (mean model with logit link):
#   Estimate Std. Error z value Pr(>|z|)    
# (Intercept)   2.1666     0.2192   9.885  < 2e-16 ***
#   A             0.6471     0.3541   1.828   0.0676 .  
#   B            -1.8617     0.2583  -7.206 5.76e-13 ***
#   A:B          -4.2632     0.5156  -8.268  < 2e-16 ***
#   
#   Phi coefficients (precision model with identity link):
#   Estimate Std. Error z value Pr(>|z|)  
# (phi)    71.57      29.50   2.426   0.0153 *
#   ---
#   Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
# 
# Type of estimator: ML (maximum likelihood)
# Log-likelihood: 24.56 on 5 Df
# Pseudo R-squared: 0.9626
# Number of iterations: 62 (BFGS) + 2 (Fisher scoring) 


# ----------------------------------------------------------


# Fractional response model
install.packages("frm")
library("frm")
frm(Y,cbind(A, B, AB=A*B),linkfrac="logit")


*** Fractional logit regression model ***

#   Estimate Std. Error t value Pr(>|t|)    
# INTERCEPT  2.197225   0.157135  13.983    0.000 ***
#   A          0.389465   0.530684   0.734    0.463    
#   B         -1.888120   0.159879 -11.810    0.000 ***
#   AB        -4.174668   0.555642  -7.513    0.000 ***
#   
#   Note: robust standard errors
# 
# Number of observations: 12 
# R-squared: 0.992