Как исправить в R: неверный тип (список) для переменной


Одна ошибка, с которой вы можете столкнуться в R:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
 invalid type (list) for variable 'x'

Эта ошибка обычно возникает, когда вы пытаетесь подобрать регрессионную модель или модель ANOVA в R и используете список для одной из переменных вместо вектора .

В этом руководстве рассказывается, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, я пытаюсь подогнать простую модель линейной регрессии в R:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ x)

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
 invalid type (list) for variable 'x'

Я получаю сообщение об ошибке, потому что функция lm() может принимать только векторы в качестве входных данных, а переменная x в настоящее время является списком.

Как избежать ошибки

Самый простой способ избежать этой ошибки — просто использовать функцию unlist() для преобразования переменной списка в вектор:

#define variables
x <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#attempt to fit regression model
model <- lm(y ~ unlist(x))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x))

Residuals:
 Min 1Q Median 3Q Max 
-1.1282 -0.4194 -0.1087 0.2966 1.7068 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 6.58447 0.55413 11.88 2.31e-06 \*\*\*
unlist(x) 1.70874 0.06544 26.11 4.97e-09 \*\*\*
---
Signif. codes: 0 '\*\*\*' 0.001 '\*\*' 0.01 '\*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8134 on 8 degrees of freedom
Multiple R-squared: 0.9884, Adjusted R-squared: 0.987 
F-statistic: 681.8 on 1 and 8 DF, p-value: 4.97e-09

Обратите внимание, что на этот раз мы можем подобрать простую модель линейной регрессии без каких-либо ошибок, потому что мы использовали unlist() для преобразования переменной x в вектор.

Обратите внимание, что если вы подгоняете модель множественной линейной регрессии и у вас есть несколько переменных-предикторов, которые в настоящее время являются объектами списка, вы можете использовать unlist() для преобразования каждого из них в векторы перед подгонкой модели регрессии:

#define variables
x1 <- list(1, 4, 4, 5, 7, 8, 9, 10, 13, 14)
x2 <- list(20, 16, 16, 15, 16, 12, 10, 8, 8, 4)
y <- c(10, 13, 13, 14, 18, 20, 22, 24, 29, 31)

#fit multiple linear regression model
model <- lm(y ~ unlist(x1) + unlist(x2))

#view the model output
summary(model)

Call:
lm(formula = y ~ unlist(x1) + unlist(x2))

Residuals:
 Min 1Q Median 3Q Max 
-1.1579 -0.4211 -0.1386 0.3108 1.7130 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 8.34282 4.44971 1.875 0.102932 
unlist(x1) 1.61339 0.24899 6.480 0.000341 \*\*\*
unlist(x2) -0.08346 0.20937 -0.399 0.702044 
---
Signif. codes: 0 '\*\*\*' 0.001 '\*\*' 0.01 '\*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8599 on 7 degrees of freedom
Multiple R-squared: 0.9887, Adjusted R-squared: 0.9854 
F-statistic: 305.1 on 2 and 7 DF, p-value: 1.553e-07

Мы снова не получаем никаких ошибок, так как мы преобразовали каждый из объектов списка в векторы.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в R:

Как интерпретировать вывод glm в R
Как интерпретировать результаты ANOVA в R
Как обращаться с предупреждением R: glm.fit: алгоритм не сошелся

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.