Как в R мы можем динамически изменять переменные в указанной линейной модели, которые относятся к разному типу (факториал, числовой c)? - PullRequest
0 голосов
/ 19 июня 2020

В R я пытаюсь динамически изменять переменные внутри моей линейной модели. Я сохранил символьный вектор переменных, которые я хочу использовать в моем lm как модерирующие переменные. Это хорошо работает для переменных типа numeri c, однако это не лучшее решение для переменных факторного типа, поскольку 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               

Как можно видеть, для Для переменных типа numeri c это решение, похоже, работает (количество уровней в NULL, как и должно быть, и вывод lm выглядит нормально). Однако для факторных переменных количество уровней также равно "NULL", поэтому R не знает, что эта переменная имеет тип-фактор и имеет уровни.

Что я мог сделать, чтобы запустить свою линейную модель и позволить переменным динамически изменяться на лету, при этом R знает, какого типа переменная? Есть ли лучший способ решить эту проблему?

Заранее благодарим вас за любые ответы.

1 Ответ

0 голосов
/ 19 июня 2020

Если вы хотите, чтобы l oop выводил информацию о 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)
...