gpt4 book ai didi

r - R 中的因子水平默认为 1 和 2 |虚拟变量

转载 作者:行者123 更新时间:2023-12-04 12:18:11 24 4
gpt4 key购买 nike

我正在从 Stata 过渡到 R。在 Stata 中,如果我将因子水平(比如-0 和 1)标记为(M 和 F),则 0 和 1 将保持原样。此外,这对于大多数软件(包括 Excel 和 SPSS)中的虚拟变量线性回归是必需的。

但是,我注意到 R 默认因子水平为 1,2 而不是 0,1。我不知道为什么 R 会这样做,尽管内部回归(并且正确地)假设 0 和 1 作为因子变量。我将不胜感激任何帮助。

这是我所做的:

尝试 #1:

sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(1,0),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 2 1 2 1 1

似乎因子水平现在重置为 1 和 2。我相信 1 和 2s 是对此处因子水平的引用。但是,我丢失了原始值,即 0 和 1。

尝试2:
sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(0,1),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 1 2 1 2 2

同上。我的 0 和 1 现在是 1 和 2。相当令人惊讶。为什么会发生这种情况。

尝试3
现在,我想看看 1s 和 2s 是否有任何不良影响回归。所以,这就是我所做的:

这是我的数据的样子:
> head(data.frame(sassign$total_,sassign$gender))
sassign.total_ sassign.gender
1 357 M
2 138 M
3 172 F
4 272 F
5 149 F
6 113 F

myfit<-lm(sassign$total_ ~ sassign$gender)

myfit$coefficients
(Intercept) sassign$genderM
200.63522 23.00606

所以,事实证明手段是正确的。在运行回归时,R 确实使用 0 和 1 值作为虚拟变量。

我确实检查了 SO 上的其他线程,但他们主要谈论 R 如何编码因子变量而没有告诉我原因。 Stata 和 SPSS 通常要求基变量为“0”。所以,我想问问这个。

我很感激任何想法。

最佳答案

R不是Stata。并且您将需要忘记很多关于虚拟变量构造的知识。 R 在幕后为您完成。你不能让 R 的行为和 Stata 完全一样。确实,R 在“F”级别的模型矩阵列中确实有 0 和 1 ,但这些值乘以因子值(在本例中为 1 和 2)。然而,对比总是关于差异,差异 btwn (0,1) 与差异 btwn (1,2) 相同。

一个数据示例:

dput(dat)
structure(list(total = c(357L, 138L, 172L, 272L, 149L, 113L),
gender = structure(c(2L, 2L, 1L, 1L, 1L, 1L), .Label = c("F",
"M"), class = "factor")), .Names = c("total", "gender"), row.names = c("1",
"2", "3", "4", "5", "6"), class = "data.frame")

这两个回归模型具有不同的模型矩阵(模型矩阵是 R 构建其“虚拟变量”的方式。
> myfit<-lm(total ~ gender, dat)
>
> myfit$coefficients
(Intercept) genderM
176.5 71.0
> dat$gender=factor(dat$gender, levels=c("M","F") )
> myfit<-lm(total ~ gender, dat)
>
> myfit$coefficients
(Intercept) genderF
247.5 -71.0
> model.matrix(myfit)
(Intercept) genderF
1 1 0
2 1 0
3 1 1
4 1 1
5 1 1
6 1 1
attr(,"assign")
[1] 0 1
attr(,"contrasts")
attr(,"contrasts")$gender
[1] "contr.treatment"

> dat$gender=factor(dat$gender, levels=c("F","M") )
> myfit<-lm(total ~ gender, dat)
>
> myfit$coefficients
(Intercept) genderM
176.5 71.0
> model.matrix(myfit)
(Intercept) genderM
1 1 1
2 1 1
3 1 0
4 1 0
5 1 0
6 1 0
attr(,"assign")
[1] 0 1
attr(,"contrasts")
attr(,"contrasts")$gender
[1] "contr.treatment"

关于r - R 中的因子水平默认为 1 和 2 |虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com