在逻辑回归模型中创建数据框的问题

问题描述 投票:0回答:2

我在为逻辑回归模型创建数据框并在类似于 SAS 的 Excel 中提取结果时遇到问题。我在前 4 行中有以下数据:

dose       location   gender   Damage
9.000000  locationA   Male    0.4488765
9.000000  locationB   Female  0.1326636
9.151515  locationA   Male    0.4572672
9.151515  locationB  Female   0.1366086

此处仅创建位置 A:男性和位置 B:女性的结果。但是两个位置都有男性和女性,我应该有 4 个值 9.00000 等等......

这是我的条件:

我有 5 个剂量(x 轴)的数据,响应是损伤(二进制:0、1)。我想检查模型是否适合两个位置,每个位置都有男性和女性数据。我将我的数据分成

testData
trainData
(0.80)。我的模型合身看起来像这样::

Model <- glm(Damage ~., data = trainData, family = binomial)

new_data <- data.frame(location = c('locationA', 'locationB'),
                       gender = c('Male', 'Female'),
                       dose = rep(seq(9, 24, length.out = 100), 4))
r regression logistic-regression prediction
2个回答
0
投票

你的new_data只有两组:

> table(new_data$location, new_data$gender)  
           
            Female Male
  locationA      0  200
  locationB    200    0

试试这个:

new_data <- data.frame(location = c('locationA', 'locationB'),
                         gender = c('Male', 'Male', 'Female', 'Female'),
                         dose = rep(seq(9, 24, length.out = 100), 4))

> table(new_data$location, new_data$gender)  
           
            Female Male
  locationA    100  100
  locationB    100  100

0
投票

唯一值问题

您的数据和此处其他答案的数据的更大问题是,两者都将相同的性别分配给相同的组,因此性别和位置之间没有唯一可估计的差异。无论如何,这对于真实数据来说都是非常奇怪的,并且不会在新的预测中提供真正有用的信息。更好的方法是创建可以提供有用结果的随机数据。此外,由于您和其他答案没有可使用的训练数据(由 OP 提供最低限度可重现的数据集而不是回答者),因此很难重现您所做的事情。我已经模拟了一些数据,我模拟这些数据的方式也是我模拟预测数据的方式,所以这应该能让我清楚我在做什么。

模拟火车数据

首先,模拟数据。我将创建你们俩已经尝试过的值,以便我们有数据可供采样。

#### Create Data to Sample From ####
set.seed(123)
location.names <- c("Location A", "Location B")
gender.names <- c("Male","Female")
dose.names <- rep(seq(9, 24, length.out = 100), 4)

然后我设置一个种子来启动一个随机数生成器,这使得模拟可重现。此后,我使用

sample
从我们的模拟数据中随机抽样1000次。这实现了两件事:1)我们的数据是真正随机的 2)我们没有将所有男性放在一个位置,将所有女性放在另一个位置。我还使用
rbinom
创建二进制数据,您在创建测试数据时不会使用它。最后,您将它们全部合并到一个数据框中,并使用
head
.

检查前 10 行
#### Train Data ####
set.seed(123)
location <- sample(location.names, size = 1000, replace = T)
gender <- sample(gender.names, size = 1000, replace = T)
dose <- sample(dose.names, size = 1000, replace = T)
damage <- rbinom(n=1000, size = 1, prob = .5)
train <- data.frame(location,
                         gender,
                         dose,
                         damage)
head(train, 10)

适合模特

一如既往地拟合回归。这里我明确指定了变量:

#### Fit Model ####
fit <- glm(damage ~ location + gender + dose,
           data = train,
           family = binomial)
summary(fit)

结果如下:

Call:
glm(formula = damage ~ location + gender + dose, family = binomial, 
    data = train)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.193  -1.167  -1.141   1.187   1.215  

Coefficients:
                    Estimate Std. Error z value Pr(>|z|)
(Intercept)         0.028239   0.258970   0.109    0.913
locationLocation B -0.030834   0.126629  -0.243    0.808
genderMale          0.041228   0.126586   0.326    0.745
dose               -0.003552   0.014445  -0.246    0.806

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1386.2  on 999  degrees of freedom
Residual deviance: 1385.9  on 996  degrees of freedom
AIC: 1393.9

Number of Fisher Scoring iterations: 3

创建测试数据

我们基本上只是做与之前完全相同的事情,只是这次我们要创建 50 个新数据点以合并到一个名为

new.data
的测试数据集中。

#### Create New Data ####
location <- sample(location.names, size = 50, replace = T)
gender <- sample(gender.names, size = 50, replace = T)
dose <- sample(dose.names, size = 50, replace = T)

new.data <- data.frame(location,
                       gender,
                       dose)
head(new.data, 10)

从那里你可以使用

predict
来生成预测:

#### Predict ####
predict(fit,
        newdata = new.data)

如下所示:

            1             2             3             4             5 
-0.0074969847 -0.0039422100 -0.0098622565 -0.0062520979 -0.0109386286 
            6             7             8             9            10 
-0.0706218955 -0.0803092442 -0.0444633069 -0.0349444729  0.0267343944 
           11            12            13            14            15 
 0.0018206928 -0.0652400350 -0.0684691513 -0.0147059309 -0.0460778651 
           16            17            18            19            20 
-0.0392499613 -0.0202449350 -0.0039422100  0.0191997898 -0.0077095123 
           21            22            23            24            25 
-0.0381735892 -0.0121721443  0.0105888132 -0.0017894658 -0.0039422100 
           26            27            28            29            30 
-0.0365590311 -0.0533999421 -0.0455396790 -0.0193370777 -0.0415598491 
           31            32            33            34            35 
-0.0177225195 -0.0404834770 -0.0017894658 -0.0733128257 -0.0351016166 
           36            37            38            39            40 
-0.0085733568  0.0208143480  0.0025160225 -0.0263334962 -0.0197067489 
           41            42            43            44            45 
-0.0220280079 -0.0770801280  0.0002061346 -0.0069587987 -0.0521664263 
           46            47            48            49            50 
 0.0105888132  0.0089742550 -0.0351016166  0.0084360690  0.0057451388

使用一个预测器

在评论中,您似乎只对结果的一个预测变量的预测感兴趣。这很简单。只需用一个变量指定新数据即可。

#### Use Just one Variable ####
new.data <- data.frame(dose)
head(new.data, 10)

#### Predict ####
predict(fit,
        newdata = new.data)

仅基于单个变量给出新的预测:

           1            2            3            4            5 
-0.020413450 -0.084614733 -0.033161400 -0.060396361 -0.068469151 
           6            7            8            9           10 
-0.057010101 -0.001408423 -0.041402705 -0.051785384 -0.014324889 
          11           12           13           14           15 
-0.067392779 -0.040326333 -0.087305663 -0.040483477 -0.038868919 
          16           17           18           19           20 
 0.020814348  0.001439650 -0.035482659 -0.012340659 -0.014324889 
          21           22           23           24           25 
-0.006958799 -0.051247198 -0.032253543 -0.039788147 -0.038543260 
          26           27           28           29           30 
-0.041940891 -0.058243616 -0.023104380 -0.042636221 -0.050170826 
          31           32           33           34           35 
-0.034406287  0.023505278 -0.013955217 -0.050709012  0.006283325 
          36           37           38           39           40 
-0.001789466 -0.019168563 -0.087305663  0.014356115 -0.045865337 
          41           42           43           44           45 
-0.085152919 -0.005713912 -0.046616051 -0.081385616 -0.013629559 
          46           47           48           49           50 
-0.073851012  0.001820693 -0.004099354 -0.004099354 -0.057010101 
© www.soinside.com 2019 - 2024. All rights reserved.