在 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)
在 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)