在 R 中,我们如何在指定的线性模型中动态更改不同类型(阶乘、数字)的变量?

In R, how can we change variables dynamically in a specified linear model, which are of different type (factorial, numeric)?

在 R 中,我试图动态更改线性模型中的变量。我已经保存了一个我想在我的 lm 中用作调节变量的变量的字符向量。这适用于数字类型的变量,但是,对于因子类型变量来说,这不是一个好的解决方案,因为 R 不知道它们是具有水平的因子。

下面用一个简单的例子概述了我的问题,假设我这里有一些数据...

yVar <- c(1,2,3,4,5)
xVar <- c(2,1,2,1,2)
numVar1 <- c(1,2,2,3,4)
numVar2 <- c(1,1,2,2,3)
facVar1 <-c(1,2,3,4,5)
facVar2 <-c(1,2,1,2,1) 

xVar <- factor(xVar,levels=c(1:2),labels=c("Condition1","Condition2"))
facVar1 <-factor(facVar1,levels=c(1:5),labels=c("red","blue","green","black","yellow"))
facVar2 <-factor(facVar2, levels=c(1:2), labels=c("dog","cat"))

studyData <- data.frame(yVar,xVar,numVar1,numVar2,facVar1,facVar2)

标准模型如下所示:

standardModel <- lm(data=studyData, yVar ~ xVar)
summary.aov(standardModel)

我想动态地包含一个调节变量列表,以便与 zList 中的这个模型一起使用。因此:

zList <- c("numVar1","numVar2","facVar1","facVar2")

然后调用Z列表中的变量

for (z in zList) {
  lmfit <- lm(as.formula(paste("yVar ~ xVar*",z)), data=studyData)
  print(z)
  print(typeof(z))
  print(levels(z))
  print(summary.aov(lmfit))
}

这给出了以下输出:

[1] "numVar1"
[1] "character"
NULL
             Df Sum Sq Mean Sq F value Pr(>F)
xVar          1  0.000   0.000   0.000  1.000
numVar1       1  9.484   9.484  33.194  0.109
xVar:numVar1  1  0.230   0.230   0.806  0.534
Residuals     1  0.286   0.286               
[1] "numVar2"
[1] "character"
NULL
             Df Sum Sq Mean Sq   F value Pr(>F)    
xVar          1      0       0 2.200e-02  0.906    
numVar2       1     10      10 1.781e+31 <2e-16 ***
xVar:numVar2  1      0       0 7.560e-01  0.544    
Residuals     1      0       0                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[1] "facVar1"
[1] "character"
NULL
            Df Sum Sq Mean Sq
xVar         1      0   0.000
facVar1      3     10   3.333
[1] "facVar2"
[1] "character"
NULL
            Df Sum Sq Mean Sq F value Pr(>F)
xVar         1      0   0.000       0      1
Residuals    3     10   3.333               

可以看出,对于数字类型的变量,此解决方案似乎有效(NULL 中的级别数应该是这样,lm 输出看起来不错)。但是对于阶乘变量,水平数也是"NULL",所以R并不知道这个变量是factor类型,有水平。

我该怎么做才能 运行 我的线性模型,并允许变量动态变化,从而 R 知道变量的类型?有没有其他更好的方法来解决这个问题?

提前感谢您的任何回复。

如果您希望循环在拟合多个模型时打印有关 z 的信息,可以使用以下代码。向量zList是字符向量,所以z是字符串,可以用get(z)访问变量。

拟合模型将在列表lm_list中。然后,一系列更简单的 lapply 指令可以生成 aov 个对象(在列表中,aov_list)或汇总统计信息。

lm_list <- lapply(zList, function(z) {
  cat("\n", "name:", z, "\n")
  zvar <- get(z)
  cat("typeof:", typeof(zvar), "\n")
  cat("class:", class(zvar), "\n")
  if(is.factor(zvar)) cat("levels:", levels(zvar), "\n")
  fmla <- as.formula(paste("yVar ~ xVar *", z))
  lm(fmla, data = studyData)
})

lm_smry <- lapply(lm_list, summary)
lm_smry

aov_list <- lapply(lm_list, aov)
lapply(aov_list, summary)