标准化 R 中的定性变量以执行 glm、glm.nb 和 lm
Standardizing qualitative variables in R to perform glm's, glm.nb's and lm's
我想标准化生物数据集的变量。我需要 运行 glm、glm.nb 和 lm 使用不同的响应变量。
该数据集包含按地块划分的给定树种的计数(所有地块具有相同的大小)和一系列定性变量:植被类型、土壤类型和 presence/absence 牛。
数据
library(standardize)
library(AICcmodavg)
set.seed(1234)
# Short version of the dataset missing other response variables
dat <- data.frame(Plot_ID = 1:80,
Ct_tree = sample(x = 1:400, replace = T),
Veg = sample(x = c("Dry", "Wet", "Mixed"), size = 80, replace = T),
Soil = sample(x = c("Clay", "Sandy", "Rocky"), size = 80, replace = T),
Cattle = rep(x = c("Yes", "No"), each = 5))
问题
由于所有解释变量都是分类变量,我不确定是否可以生成具有标准化系数和标准化标准误差的标准化 lm 模型。
如果我尝试使用 scale() 通过 base R 进行标准化,我会收到错误消息,因为解释变量不是数字。我正在尝试使用标准化 R 包,但我不确定这是否符合我的需要。
型号
m1 <- standardize(formula = Ct_tree ~ 1, data = dat, family = "gaussian", scale = 1)
# Error in standardize(formula = Ct_tree ~ 1, data = dat, family = "gaussian": no variables in formula
m2 <- standardize(formula = Ct_tree ~ Veg, data = dat, family = "gaussian", scale = 1)
m3 <- standardize(formula = Ct_tree ~ Soil, data = dat, family = "gaussian", scale = 1)
m4 <- standardize(formula = Ct_tree ~ Cattle, data = dat, family = "gaussian", scale = 1)
m5 <- standardize(formula = Ct_tree ~ Veg + Soil, data = dat, family = "gaussian", scale = 1)
m6 <- standardize(formula = Ct_tree ~ Veg + Cattle, data = dat, family = "gaussian", scale = 1)
m7 <- standardize(formula = Ct_tree ~ Soil + Cattle, data = dat, family = "gaussian", scale = 1)
m8 <- standardize(formula = Ct_tree ~ Veg + Soil + Cattle, data = dat, family = "gaussian", scale = 1)
# m1_st <- standardize(formula = m1$formula, data = m1$data)
m2_st <- lm(formula = m2$formula, data = m2$data)
# [...]
m8_st <- lm(formula = m8$formula, data = m8$data)
# Produce a summary table of AICs
models <- list(Veg = m2_st, Soil = m3_st, Cattle = m4_st, VegSoil = m5_st, VegCattle = m6_st, SoilCattle = m7_st, VegSoilCattle = m8_st)
aic_tbl <- aictab(models, second.ord = TRUE, sort = TRUE)
问题
1) 我是否正确实施了标准化包?
2) 我的代码是否正在执行我所追求的标准化?
3) 当我调用 mi$data 时,看起来响应变量 (Ct_tree) 已经被标准化.这是应该发生的事情吗?我认为标准化会发生在解释变量上,而不是响应上。
4) 如何标准化截距 (Ct_tree ~ 1)?也许它不需要标准化,但我仍然需要在最终的 AIC table 中比较所有模型。
5) 我还有其他响应变量 absence/presence(分别重新编码为 0 和 1)。使用与上述相同的过程也标准化这些列在统计上是否正确? standardize 包产生一个与原始相同的 presence/absence 列。但是,如果我通过基于 R 的函数 scale() 重新缩放此类列,则生成的数字是正数和负数,带有小数,我不能应用二项式族。
6) 如果我将定性解释变量重新编码为序数(例如,土壤 = 0 表示粘土,1 表示沙质,2 表示岩石),然后对它们进行缩放,会不会在统计上是否正确?
我的回答可能是自以为是。另外,我是生物学家,不是数学家,所以数学背景好的人可以给出更合理的答案。
第一个问题是为什么我们需要标准化?基本上,我们使用它来比较不同预测变量的效果大小。假设我们要估计植物质量 (M) 如何取决于土壤中的氮浓度 (N) 和水的可用性 (W)。将有两个具有不同单位和不同振幅的预测变量。两个预测变量都是连续的非常重要。我们可以从原始数据中估计回归系数。假设最终生物量可以表示为
M = 0.1 * N + 0.2 * W + 误差
那么,哪个因素更重要?当然,我们不能仅从这些系数推断出这一点。为了进行比较,我们需要考虑因素的单位和可变性。因此,仅报告系数可能不足以理解您的基础。标准化可能是解决这种情况的办法。
现在假设我们得到了相同的回归系数,但预测变量之前已标准化。在这种情况下,很明显当氮浓度变化 1 个标准偏差单位时,植物质量变化 0.1。水也是如此(每 1 sd 单位 0.2 质量单位)。如果您的实验结合了广泛的水和氮条件,您可以认为水的重要性是氮的两倍。因此,标准化对于比较连续预测变量的影响很有用。
在你的例子中,预测变量是分类的,即因素。你最初的问题是 "does trees number differ in different condition groups?"。在这里你的结果会有一定的差异。例如,粘土上每块地的树木平均比沙土上多 50 棵。这是一个很明显的结果。如果某些条件导致树木数量发生更大的变化,那么它就会产生更强的影响。所以似乎不需要标准化。
不过,您可以再问一个问题"Is the difference of 50 trees is a high difference?"。如果平均有 10000 棵树,那么增加 50 棵树可以忽略不计。但如果平均每块地有 100 棵树,变化就非常大了。为了处理这样的问题,您可以标准化您的响应变量。因此,您将获得标准偏差单位的差异(类似于 Cohen 的 d)。
无论如何,标准化或不标准化的选择应该由您根据您在该领域的专业知识来决定。如果标准化可以帮助您解释结果,那就去做吧。如果您认为标准差单位的差异更能说明问题并且更容易为您的读者所理解,那么就去做吧。
至于我,我建议保留原始值,但以相对单位 (%) 显示结果。例如,粘土上的树木比沙土上的树木多 15%。但这又应该由您来决定。
作为结论:
- 您不需要对分类变量进行标准化。相同
适用于二进制预测器。
- 你可以标准化你的回应
如果您认为 SD 单位的差异更大
令人信服。为此
base::scale
就足够了。
- 用数字替换分类变量(并将它们视为数字)是
对你来说不是个好主意。
P.S。抱歉语法不好。
我想标准化生物数据集的变量。我需要 运行 glm、glm.nb 和 lm 使用不同的响应变量。
该数据集包含按地块划分的给定树种的计数(所有地块具有相同的大小)和一系列定性变量:植被类型、土壤类型和 presence/absence 牛。
数据
library(standardize)
library(AICcmodavg)
set.seed(1234)
# Short version of the dataset missing other response variables
dat <- data.frame(Plot_ID = 1:80,
Ct_tree = sample(x = 1:400, replace = T),
Veg = sample(x = c("Dry", "Wet", "Mixed"), size = 80, replace = T),
Soil = sample(x = c("Clay", "Sandy", "Rocky"), size = 80, replace = T),
Cattle = rep(x = c("Yes", "No"), each = 5))
问题
由于所有解释变量都是分类变量,我不确定是否可以生成具有标准化系数和标准化标准误差的标准化 lm 模型。
如果我尝试使用 scale() 通过 base R 进行标准化,我会收到错误消息,因为解释变量不是数字。我正在尝试使用标准化 R 包,但我不确定这是否符合我的需要。
型号
m1 <- standardize(formula = Ct_tree ~ 1, data = dat, family = "gaussian", scale = 1)
# Error in standardize(formula = Ct_tree ~ 1, data = dat, family = "gaussian": no variables in formula
m2 <- standardize(formula = Ct_tree ~ Veg, data = dat, family = "gaussian", scale = 1)
m3 <- standardize(formula = Ct_tree ~ Soil, data = dat, family = "gaussian", scale = 1)
m4 <- standardize(formula = Ct_tree ~ Cattle, data = dat, family = "gaussian", scale = 1)
m5 <- standardize(formula = Ct_tree ~ Veg + Soil, data = dat, family = "gaussian", scale = 1)
m6 <- standardize(formula = Ct_tree ~ Veg + Cattle, data = dat, family = "gaussian", scale = 1)
m7 <- standardize(formula = Ct_tree ~ Soil + Cattle, data = dat, family = "gaussian", scale = 1)
m8 <- standardize(formula = Ct_tree ~ Veg + Soil + Cattle, data = dat, family = "gaussian", scale = 1)
# m1_st <- standardize(formula = m1$formula, data = m1$data)
m2_st <- lm(formula = m2$formula, data = m2$data)
# [...]
m8_st <- lm(formula = m8$formula, data = m8$data)
# Produce a summary table of AICs
models <- list(Veg = m2_st, Soil = m3_st, Cattle = m4_st, VegSoil = m5_st, VegCattle = m6_st, SoilCattle = m7_st, VegSoilCattle = m8_st)
aic_tbl <- aictab(models, second.ord = TRUE, sort = TRUE)
问题
1) 我是否正确实施了标准化包?
2) 我的代码是否正在执行我所追求的标准化?
3) 当我调用 mi$data 时,看起来响应变量 (Ct_tree) 已经被标准化.这是应该发生的事情吗?我认为标准化会发生在解释变量上,而不是响应上。
4) 如何标准化截距 (Ct_tree ~ 1)?也许它不需要标准化,但我仍然需要在最终的 AIC table 中比较所有模型。
5) 我还有其他响应变量 absence/presence(分别重新编码为 0 和 1)。使用与上述相同的过程也标准化这些列在统计上是否正确? standardize 包产生一个与原始相同的 presence/absence 列。但是,如果我通过基于 R 的函数 scale() 重新缩放此类列,则生成的数字是正数和负数,带有小数,我不能应用二项式族。
6) 如果我将定性解释变量重新编码为序数(例如,土壤 = 0 表示粘土,1 表示沙质,2 表示岩石),然后对它们进行缩放,会不会在统计上是否正确?
我的回答可能是自以为是。另外,我是生物学家,不是数学家,所以数学背景好的人可以给出更合理的答案。
第一个问题是为什么我们需要标准化?基本上,我们使用它来比较不同预测变量的效果大小。假设我们要估计植物质量 (M) 如何取决于土壤中的氮浓度 (N) 和水的可用性 (W)。将有两个具有不同单位和不同振幅的预测变量。两个预测变量都是连续的非常重要。我们可以从原始数据中估计回归系数。假设最终生物量可以表示为
M = 0.1 * N + 0.2 * W + 误差
那么,哪个因素更重要?当然,我们不能仅从这些系数推断出这一点。为了进行比较,我们需要考虑因素的单位和可变性。因此,仅报告系数可能不足以理解您的基础。标准化可能是解决这种情况的办法。
现在假设我们得到了相同的回归系数,但预测变量之前已标准化。在这种情况下,很明显当氮浓度变化 1 个标准偏差单位时,植物质量变化 0.1。水也是如此(每 1 sd 单位 0.2 质量单位)。如果您的实验结合了广泛的水和氮条件,您可以认为水的重要性是氮的两倍。因此,标准化对于比较连续预测变量的影响很有用。
在你的例子中,预测变量是分类的,即因素。你最初的问题是 "does trees number differ in different condition groups?"。在这里你的结果会有一定的差异。例如,粘土上每块地的树木平均比沙土上多 50 棵。这是一个很明显的结果。如果某些条件导致树木数量发生更大的变化,那么它就会产生更强的影响。所以似乎不需要标准化。
不过,您可以再问一个问题"Is the difference of 50 trees is a high difference?"。如果平均有 10000 棵树,那么增加 50 棵树可以忽略不计。但如果平均每块地有 100 棵树,变化就非常大了。为了处理这样的问题,您可以标准化您的响应变量。因此,您将获得标准偏差单位的差异(类似于 Cohen 的 d)。
无论如何,标准化或不标准化的选择应该由您根据您在该领域的专业知识来决定。如果标准化可以帮助您解释结果,那就去做吧。如果您认为标准差单位的差异更能说明问题并且更容易为您的读者所理解,那么就去做吧。 至于我,我建议保留原始值,但以相对单位 (%) 显示结果。例如,粘土上的树木比沙土上的树木多 15%。但这又应该由您来决定。
作为结论:
- 您不需要对分类变量进行标准化。相同 适用于二进制预测器。
- 你可以标准化你的回应
如果您认为 SD 单位的差异更大
令人信服。为此
base::scale
就足够了。 - 用数字替换分类变量(并将它们视为数字)是 对你来说不是个好主意。
P.S。抱歉语法不好。