17 авг. 2022 г.
читать 2 мин
Одна ошибка, с которой вы можете столкнуться в 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: алгоритм не сошелся
One error you may encounter in R is:
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : invalid type (list) for variable 'x'
This error usually occurs when you attempt to fit a regression model or an ANOVA model in R and use a list for one of the variables instead of a vector.
This tutorial shares how to fix this error in practice.
How to Reproduce the Error
Suppose I attempt to fit a simple linear regression model in 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'
I receive an error because the lm() function can only take vectors as input and the x variable is currently a list.
How to Avoid the Error
The easiest way to avoid this error is to simply use the unlist() function to convert the list variable to a vector:
#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
Notice that we’re able to fit the simple linear regression model without any errors this time because we used unlist() to convert variable x to a vector.
Note that if you’re fitting a multiple linear regression model and you have multiple predictor variables that are currently list objects, you can use unlist() to convert each of them to vectors before fitting the regression model:
#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
Once again we don’t receive any errors since we converted each of the list objects to vectors.
Additional Resources
The following tutorials explain how to perform other common operations in R:
How to Interpret glm Output in R
How to Interpret ANOVA Results in R
How to Handle R Warning: glm.fit: algorithm did not converge
I’m getting this error in remix:
Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested
It refers to msg.sender
on line number 9 below. Here is the code I’m writing:
function startProject(
string calldata title,
string calldata description,
uint durationInDays,
uint amountToRaise
) external {
uint raiseUntil = block.timestamp.add(durationInDays.mul(1 days));
Project newProject = new Project(
msg.sender,
title,
description,
raiseUntil,
amountToRaise
);
projects.push(newProject);
Why am I getting this error? How can I resolve it?
TylerH
20.7k64 gold badges72 silver badges97 bronze badges
asked Nov 21, 2021 at 7:54
6
The linked code contains a definition of the contract Project
and its constructor
:
constructor
(
address payable projectStarter,
string memory projectTitle,
string memory projectDesc,
uint fundRaisingDeadline,
uint goalAmount
) public {
// ...
}
It accepts address payable
as the first argument. However, msg.sender
is not payable
by default (since Solidity 0.8.0).
Solution: Typecast the address
to address payable
:
Project newProject = new Project(
payable(msg.sender),
title,
description,
raiseUntil,
amountToRaise
);
answered Nov 21, 2021 at 15:07
Petr HejdaPetr Hejda
38.7k8 gold badges71 silver badges96 bronze badges
0
If you don’t yet know what the value of an address type is, pass it it in as: address(0)
answered Feb 28, 2022 at 8:32
Есть таблица в кликхаус.Выполняю следующий запрос используя метод extract.
select * from posts where extract(text,'(виртуальныw{,4}s|дата-центрw{,4}s)') LIMIT 200
При выполнение запроса выходит следующая ошибка:
Code: 59, e.displayText() = DB::Exception: Invalid type for filter in PREWHERE: Array(String) (version 21.1.3.32 (official build))
Гуглил гугл ответов не дал.Думал дело в неправильности регулярного выражения но проверил через этот сайт регулярка правильная.
Что я делаю не так ?
задан 17 фев 2021 в 9:52
RaharasomahaRaharasomaha
4521 золотой знак5 серебряных знаков22 бронзовых знака
3
Я не могу воспроизвести ошибку – получаю ‘Invalid type for filter in WHERE: String’:
SELECT toString(number) AS text
FROM numbers(5)
WHERE extract(text, '(виртуальны\w{,4}\s|дата-центр\w{,4}\s)')
/*
Received exception from server (version 21.2.3):
Code: 59. DB::Exception: Received from localhost:9000. DB::Exception: Invalid type for filter in WHERE: String.
*/
Тем не менне используйте функции empty или notEmpty, чтобы исправить ошибку:
SELECT toString(number) AS text
FROM numbers(5)
WHERE empty(extract(text, '(виртуальны\w{,4}\s|дата-центр\w{,4}\s)'))
/*
┌─text─┐
│ 0 │
│ 1 │
│ 2 │
│ 3 │
│ 4 │
└──────┘
*/
ответ дан 17 фев 2021 в 18:22
vladimirvladimir
3011 серебряный знак8 бронзовых знаков
2
Сообщение от mersinvald
А как правильно объявлять динамические массивы?
Как создать двумерный массив неконстантного размера в С++
Существует несколько способов. Рассмотрим их на примере двумерного массива ‘array’ размера N x M с элементами типа ‘int’. При этом ни N, ни M не являются константами времени компиляции.
1. Простейший способ: вектор векторов
C++ | ||
|
В результате будет определен вектор векторов, представляющий двумерный массив N x M, заполненный изначально нулями.
Синтаксис доступа – привычный ‘array[i][j]’.
Передача в функции – как ‘vector<vector<int>> &’
C++ | ||
|
В этом случае размеры массива в функцию передавать не надо, так как вектор уже хранит свой размер внутри себя.
2. Моделирование двумерного массива через одномерный с пересчетом индексов
C++ | ||
|
Это создаст одномерный массив размера N*M, заполненный нулями.
Чтобы доступиться к элементу по двумерному индексу [i][j] просто выполняем пересчет индексов по формуле ‘i * M + j’, т.е. доступаемся к элементу ‘array[i * M + j]’. (На самом деле именно так работают встроенный тип “массив” в языках С и С++ для любой размерности массива.)
Передача в функцию – очевидным образом
C++ | ||
|
Освобождение памяти
Понятно, что в этом способе вместо голого массива можно использовать ‘std::vector’.
3а. “Рваный” массив с индивидуальным выделением памяти
C++ | ||
|
Синтаксис доступа – привычный ‘array[i][j]’.
Передача в функции
C++ | ||
|
Освобождение памяти
C++ | ||
|
Несложно догадаться, что этот способ – это практически то же самое, что и способ 1, только с голыми массивами вместо векторов.
3б. “Рваный” массив с общим выделением памяти
C++ | ||
|
Синтаксис доступа и передача в функции – как и в предыдущем способе.
Освобождение памяти
C++ | ||
|
Если внимательно посмотреть на способ 2 и способ 3б, то можно заметить, что они очень похожи. В обоих случаях сами данные хранятся в одномерном массиве размера N*M. Разница только в том, что в способе 2 вычисление финального индекса делается через полную формулу, а в способе 3б это вычисление частично уже выполнено для начала каждой строки двумерного массива и указатели на эти начала сохранены в дополнительном массиве указателей.
Добавлено через 11 минут
Сообщение от mersinvald
А как правильно объявнять динамические массивы?
Разумеется, вышеприведенные разглагольствования на тему динамических массивов вам нужны только в том случае, если вам действительно нужен массив неконстантного размера в программе. Т.е. если величина ‘Size’, например, вводится пользователем или читается из файла, т.е. заранее не известна.
Если же величина ‘Size’ жестко задана на стадии компиляции, то все эти усилия становятся ненужными. Просто объявите ее глобально как
и смело пользуйтесь обычными встроенными массивами размера ‘Size’.