我在为逻辑回归模型创建数据框并在类似于 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))
你的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
您的数据和此处其他答案的数据的更大问题是,两者都将相同的性别分配给相同的组,因此性别和位置之间没有唯一可估计的差异。无论如何,这对于真实数据来说都是非常奇怪的,并且不会在新的预测中提供真正有用的信息。更好的方法是创建可以提供有用结果的随机数据。此外,由于您和其他答案没有可使用的训练数据(由 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