📜  R 编程中分类变量的回归

📅  最后修改于: 2022-05-13 01:55:39.715000             🧑  作者: Mango

R 编程中分类变量的回归

回归是一个多步骤过程,用于估计因变量与一个或多个自变量(也称为预测变量或协变量)之间的关系。回归分析主要用于两个概念上不同的目的:预测和预测,其使用与机器学习领域有很大的重叠;其次,它有时可用于推断自变量和因变量之间的关系。

分类变量回归

分类变量是可以采用有限和固定数量的可能值之一的变量,根据某些定性属性将每个个体或其他观察单位分配给特定的组或名义类别。它们也被称为因子或定性变量。最适合分类变量的回归分析类型是逻辑回归。 Logistic 回归使用最大似然估计来估计参数。它推导出一组变量(独立)和一个分类变量(从属)之间的关系。使用 R 语言实现回归模型要容易得多,因为它内置了优秀的库。现在,让我们尝试建立一个带有分类变量的逻辑回归模型,以便更好地理解。

示例:目标是通过 gre、gpa 和 rank 等变量预测候选人是否会被大学录取。 R 脚本并排提供,并进行注释以更好地理解用户。数据采用 .csv 格式。我们将使用getwd()函数获取工作目录,并在其中放置数据集 binary.csv 以进一步进行。请在此处下载 CSV 文件。

R
# preparing the dataset 
getwd() 
data <- read.csv("binary.csv" ) 
str(data)


R
# converting admit and rank
# columns into factor variables
data$admit = as.factor(data$admit)
data$rank = as.factor(data$rank)
  
# two-way table of factor
# variable
xtabs(~admit + rank, data = data)


R
# Partitioning of data
set.seed(1234)
data1<-sample(2, nrow(data), 
                   replace = T, 
                 prob = c(0.6, 0.4))
train<-data[data1 == 1,]
test<-data[data1 == 2,]


R
mymodel<-glm(admit~gre + gpa + rank, 
                        data = train, 
                        family = 'binomial')
summary(mymodel)


R
mymodel<-glm(admit~gpa + rank, 
                  data = train, 
                 family = 'binomial')


R
# Prediction
p1<-predict(mymodel, train, 
            type = 'response')
head(p1)


R
head(train)


R
# confusion Matrix 
# $Misclassification error -Training data  
pre1<-ifelse(p1 > 0.5, 1, 0)
table<-table(Prediction = pre1, 
             Actual = train$admit) 
table


R
1 - sum(diag(table)) / sum(table)


输出:



'data.frame':    400 obs. of  4 variables:
 $ admit: int  0 1 1 1 0 1 1 0 1 0 ...
 $ gre  : int  380 660 800 640 520 760 560 400 540 700 ...
 $ gpa  : num  3.61 3.67 4 3.19 2.93 3 2.98 3.08 3.39 3.92 ...
 $ rank : int  3 3 1 4 4 2 1 2 3 2 ...

查看数据集的结构,我们可以观察到它有 4 个变量,其中 Admit 表示候选人是否会被录取(1 如果被录取,0 如果不被录取)gre、gpa 和 rank 给出候选人的 gre 分数,他/她在以前的大学和以前的大学排名中的gpa。我们使用admit 作为因变量,gre、gpa 和rank 作为自变量。现在,请注意承认和排名是分类变量,但属于数字类型。但是为了在我们的模型中将它们用作分类变量,我们将使用as.factor()函数将它们转换为因子变量。

电阻

# converting admit and rank
# columns into factor variables
data$admit = as.factor(data$admit)
data$rank = as.factor(data$rank)
  
# two-way table of factor
# variable
xtabs(~admit + rank, data = data)

输出:

rank
admit  1  2  3  4
    0 28 97 93 55
    1 33 54 28 12

现在将数据分成训练集和测试集。训练集用于寻找因变量和自变量之间的关系,而测试集用于分析模型的性能。我们使用 60% 的数据集作为训练集。将数据分配到训练集和测试集是使用随机抽样完成的。我们使用sample()函数对 R 进行随机抽样。使用set.seed()每次生成相同的随机样本并保持一致性。

电阻

# Partitioning of data
set.seed(1234)
data1<-sample(2, nrow(data), 
                   replace = T, 
                 prob = c(0.6, 0.4))
train<-data[data1 == 1,]
test<-data[data1 == 2,]

现在为我们的数据构建逻辑回归模型。 glm()函数帮助我们为我们的数据建立一个神经网络。我们在这里使用的glm()函数具有以下语法。

ParameterDescription
formulaa symbolic description of the model to be fitted.
familya description of the error distribution and link function to be used in the model.
dataan optional data frame.
weightsan optional vector of ‘prior weights’ to be used in the fitting process. Should be NULL or a numeric vector.
subsetan optional vector specifying a subset of observations to be used in the fitting process.
na.actiona function which indicates what should happen when the data contain NAs.
startstarting values for the parameters in the linear predictor.
etastartstarting values for the linear predictor.
mustartstarting values for the vector of means.
offsetthis can be used to specify an a priori known component to be included in the linear predictor during fitting. 
controla list of parameters for controlling the fitting process.
modela logical value indicating whether model frame should be included as a component of the returned value.
methodthe method to be used in fitting the model.
x,y

 logical values indicating whether the response vector and model matrix used in the fitting process should be returned as

 components of the returned value.

singular.oklogical; if FALSE a singular fit is an error.
contrastsan optional list.
 arguments to be used to form the default control argument if it is not supplied directly.

电阻

mymodel<-glm(admit~gre + gpa + rank, 
                        data = train, 
                        family = 'binomial')
summary(mymodel)

输出:

Call:
glm(formula = admit ~ gre + gpa + rank, family = "binomial", 
    data = train)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6576  -0.8724  -0.6184   1.0683   2.1035  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept) -4.972329   1.518865  -3.274  0.00106 **
gre          0.001449   0.001405   1.031  0.30270   
gpa          1.233117   0.450550   2.737  0.00620 **
rank2       -0.784080   0.406376  -1.929  0.05368 . 
rank3       -1.203013   0.426614  -2.820  0.00480 **
rank4       -1.699652   0.536974  -3.165  0.00155 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 312.66  on 248  degrees of freedom
Residual deviance: 283.38  on 243  degrees of freedom
AIC: 295.38

Number of Fisher Scoring iterations: 4

从模型的总结来看,很明显 gre 在预测中没有显着作用,因此我们可以将其从模型中删除并重写如下:

电阻

mymodel<-glm(admit~gpa + rank, 
                  data = train, 
                 family = 'binomial')

现在,让我们尝试通过做出一些预测来分析我们的回归模型。

电阻

# Prediction
p1<-predict(mymodel, train, 
            type = 'response')
head(p1)

输出:



1         7         8        10        12        13 
0.3013327 0.3784012 0.2414806 0.5116852 0.4610888 0.7211702 

电阻

head(train)

输出:

admit gre  gpa rank
1      0 380 3.61    3
7      1 560 2.98    1
8      0 400 3.08    2
10     0 700 3.92    2
12     0 440 3.22    1
13     1 760 4.00    1

然后,我们通过创建混淆矩阵来对结果进行四舍五入,以比较真/假阳性和阴性的数量。我们将用训练数据形成一个混淆矩阵。

电阻

# confusion Matrix 
# $Misclassification error -Training data  
pre1<-ifelse(p1 > 0.5, 1, 0)
table<-table(Prediction = pre1, 
             Actual = train$admit) 
table

输出:

Actual
Prediction   0   1
         0 158  55
         1  11  25

该模型生成 158 个真阴性 (0)、25 个真阳性 (1),同时有 11 个假阴性和 55 个假阳性。现在,让我们计算误分类误差(对于训练数据){1 – 分类误差}

电阻

1 - sum(diag(table)) / sum(table)

输出:

[1] 0.2650602

误分类错误率为 24.9%。在这种情况下,我们可以使用带有分类变量的回归技术来处理各种其他数据。

回归分析是一种非常有效的方法,可以使用多种类型的回归模型。这种选择通常取决于您拥有的因变量数据类型以及提供最佳拟合的模型类型,例如逻辑回归最适合分类变量。