我想标准化生物数据集的变量。我需要使用不同的响应变量运行 glm、glm.nb 和 lm。
该数据集包含按地块划分的给定树种的数量(所有地块大小相同)和一系列定性变量:植被类型、土壤类型和牛的存在/不存在。
数据
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))
Run Code Online (Sandbox Code Playgroud)
问题
由于所有解释变量都是分类变量,我不确定是否可以生成具有标准化系数和标准化标准误差的标准化 lm 模型。
如果我尝试使用scale()通过基数 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)
Run Code Online (Sandbox Code Playgroud)
问题
1)我是否正确实施了标准化包?
2)我的代码是否符合我所追求的标准化?
3)当我调用mi$data 时,看起来响应变量 (Ct_tree) 已经标准化。这是应该发生的事情吗?我认为标准化会发生在解释变量上,而不是响应上。
4)如何标准化截距 (Ct_tree ~ 1)?也许它不需要标准化,但我仍然需要它在最终的 AIC 表中来比较所有模型。
5)我还有其他不存在/存在的响应变量(分别记录为 0 和 1)。使用与上述相同的过程对这些列进行标准化在统计上是否正确?标准化包生成与原始相同的存在/不存在列。但是,如果我通过函数scale()从基数 R重新调整此类列,则生成的数字是正数和负数,带小数,并且我不能应用二项式族。
6)如果我将定性解释变量重新编码为序数(例如,土壤 = 0 表示粘土,1 表示沙地,2 表示岩石),然后对它们进行缩放,这在统计上是否正确?
我的回答可能有偏见。另外,我是生物学家而不是数学家,所以有更好数学背景的人可以给出更合理的答案。
第一个问题是为什么我们需要标准化?基本上,我们使用它是为了比较不同预测变量的效果大小。假设我们想估计植物质量 (M) 如何取决于土壤中的氮浓度 (N) 和水的可用性 (W)。将有两个具有不同单位和不同幅度的预测变量。两个预测变量都是连续的,这一点非常重要。我们可以从原始数据中估计回归系数。让我们假设最终的生物量可以表示为
M = 0.1 * N + 0.2 * W + 误差
那么,哪个因素更重要呢?当然,我们不能仅从这些系数中推断出这一点。为了进行比较,我们需要考虑因素的单位和可变性。因此,仅报告系数可能不足以了解您的创立。标准化可能是这种情况的解决方案。
现在让我们假设我们得到了相同的回归系数,但预测变量以前是标准化的。在这种情况下,很明显,当氮浓度变化 1 个标准偏差单位时,植物质量变化 0.1。水也是如此(每 1 sd 单位为 0.2 质量单位)。如果您的实验结合了广泛的水和氮条件,您可以建议水比氮重要两倍。因此,标准化对于比较连续预测变量的效果很有用。
在您的情况下,预测变量是分类的即因素。您最初的问题是“不同条件组的树木数量是否不同?”。在这里,您的结果将有所不同。例如,粘土土壤上每块地的树木平均比沙质土壤多 50 棵树。这是一个很明显的结果。如果某些条件导致树木数量发生较大变化,则其影响会更大。所以似乎不需要标准化。
不过,您可以再问一个问题“50 棵树的差异是否很大?”。如果平均树数为 10000 棵树,那么增加 50 棵树是可以忽略的。但是如果每个地块平均有 100 棵树,那么变化真的很大。为了处理这样的问题,您可以标准化您的响应变量。因此,您将获得标准偏差单位的差异(类似于 Cohen 的 d)。
无论如何,标准化或不标准化的选择应该由您根据您在该领域的专业知识来决定。如果标准化能帮助你解释你的结果,那就去做吧。如果您认为标准偏差单位的差异更具说明性并且对您的读者更容易理解,那么就去做。至于我,我建议保留原始值,但以相对单位 (%) 呈现结果。例如,粘土上的树木比沙土上的树木多 15%。但这又应该是你的决定。
作为结论:
base::scale就足够了。PS抱歉语法不好。