标准化R中的定性变量以执行glm,glm.nb和lm

时间:2018-12-28 07:05:25

标签: r glm

我想标准化生物数据集的变量。我需要使用不同的响应变量来运行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))

问题

由于所有解释变量都是分类变量,因此我不确定是否可以生成具有标准化系数和标准化标准误差的标准化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表中对所有模型进行比较。

5)我还有其他响应变量,它们是不存在/存在(分别记录为0和1)。使用与上述相同的方法对这些列进行标准化在统计上是否正确?标准化程序包将产生与原始列相同的存在/不在列。但是,如果我通过基数R中的函数 scale()重新缩放此列,则生成的数字为正数和负数(带小数点),因此我无法应用二项式族。

6)如果我将定性解释变量重新编码为序数(例如,土壤= 0表示粘土,1表示沙质,2表示岩石),然后对其进行缩放,那么在统计上是否正确?< / p>

1 个答案:

答案 0 :(得分:3)

我的回答可能会引起怀疑。另外,我是生物学家,而不是数学家,所以拥有更好数学背景的人可以给出更合理的答案。

第一个问题是为什么我们需要标准化?基本上,我们使用它来比较不同预测变量的影响大小。假设我们要估算植物质量(M)如何取决于土壤中氮的浓度(N)和水的可用性(W)。将有两个具有不同单位和不同幅度的预测变量。两个预测变量都是连续的,这一点非常重要。我们可以从原始数据估计回归系数。假设最终生物量可以表示为

M = 0.1 * N + 0.2 * W +误差

那么,哪个因素更重要?当然,我们不能仅从这些系数中得出结论。为了进行比较,我们需要考虑因素的单位和可变性。因此,仅报告系数可能不足以理解您的创建。标准化可以解决这种情况。

现在让我们假设我们具有相同的回归系数,但是预测变量以前已经标准化。在这种情况下,很明显,当氮浓度以1个标准差为单位变化时,植物质量也将变化0.1。水也是如此(每1 sd单位0.2质量单位)。如果您的实验考虑到了广泛的水和氮条件,那么您可以认为水的重要性是氮的两倍。因此,标准化对于比较连续预测变量的效果很有用。

在您的情况下,预测变量是分类的,即因素。您最初的问题是“不同条件组中的树数是否不同?”。在这里,您的结果将会有所不同。例如,在每块地上,粘土地上的树木平均多于沙土。这是一个很明显的结果。如果某种情况导致树木数量的较大变化,则其影响更大。因此似乎不需要标准化。

仍然,您可以问一个额外的问题:“ 50棵树的差异是高差异吗?”。如果平均树数为10000,则忽略50棵树。但是,如果每个地块平均有100棵树,那么变化确实很大。为了处理此类问题,您可以标准化您的响应变量。这样,您将获得标准差单位的差异(类似于Cohen的d)。

无论如何,根据您在该领域的专业知识,选择标准化还是不标准化是您的决定。如果标准化将帮助您解释您的结果,请这样做。如果您认为标准偏差单位的差异更能说明问题,并且对读者更易理解,则可以这样做。 对于我来说,我建议保留原始值,但以相对单位(%)表示结果。例如,粘土树比沙土树多15%。但这又是您的决定。

结论:

  1. 您不需要归类变量标准化。相同 用于二进制预测变量。
  2. 您可以标准化您的回复 如果您认为SD单位之间的差异更大,请选择变量 令人信服。为此base::scale就足够了。
  3. 用数字替换类别变量(并将其视为数字)是 在您的情况下不是一个好主意。

P.S。对不起,语法不好。