#r #machine-learning #linear-regression
Вопрос:
У меня есть следующий набор данных
data lt;- data.frame(height=c(184,163,170,161,162,167,180,175,182,176,180,164,178,155,187,176,176,152,160,190), weight=c(83,51,80,53,64,70,75,74,86,78,90,66,60,44,81,75,68,63,51,88), shoe_size=c(44,37,42,35,38,40,43,42,44,43,45,40,40,35,44,40,42,39,36,45), age=c(26,24,26,26,25,28,28,24,31,25,29,24,38,27,28,32,26,33,26,26)) hoodie = with(data, ifelse(weightlt;=45, "XXS", ifelse(weightgt;45 amp; weightlt;=52, "XS", ifelse(weightgt;52 amp; weightlt;=57, "S", ifelse(weightgt;57 amp; weightlt;=64, "M", ifelse(weightgt;64 amp; weightlt;=75, "L", "XL")))))) hoodie_data = cbind(hoodie, data)
Я должен предсказать размер толстовки , т. Е. S , M, L и т.д., Основываясь на размере и весе моей обуви Я пытаюсь это сделать
linear_model lt;- lm(hoodie ~ weight shoe_size,data = hoodie_data)
Это приводит к ошибке:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : NA/NaN/Inf in 'y' In addition: Warning message: In storage.mode(v) lt;- "double" : NAs introduced by coercion
при использовании as.factor()
или as.numeric()
на толстовке он возвращает NA
Как действовать дальше?
Комментарии:
1. Проблема в том, что ваша колонка с капюшоном идеально предсказуема по колонке веса. Добавление обоих в ваш узел приводит к сингулярностям. Решение в пользу одного из них и исключение другого из модели должно решить проблему.
2. вы ищете классификационную модель — попробуйте полиномиальную логистическую регрессию (вместо линейной регрессии; где ответ числовой). т. е.
multinom
формаnnet
Ответ №1:
Есть две проблемы. Один из них-сингулярности, как упоминал дешен. То есть существуют идеальные линейные взаимосвязи между переменными в data
. Смотреть cor()
ниже. Другая проблема заключается в том, что вы не можете использовать категориальные переменные (например, «S», «M», «L») непосредственно в качестве зависимой переменной. В этом случае вы можете использовать фиктивное кодирование или использовать число (например, 0 ~ 5) для представления размера толстовки.
data lt;- data.frame(height=c(184,163,170,161,162,167,180,175,182,176,180,164,178,155,187,176,176,152,160,190), weight=c(83,51,80,53,64,70,75,74,86,78,90,66,60,44,81,75,68,63,51,88), shoe_size=c(44,37,42,35,38,40,43,42,44,43,45,40,40,35,44,40,42,39,36,45), age=c(26,24,26,26,25,28,28,24,31,25,29,24,38,27,28,32,26,33,26,26)) hoodie = with(data, ifelse(weightlt;=45, 0, ifelse(weightgt;45 amp; weightlt;=52, 1, ifelse(weightgt;52 amp; weightlt;=57, 2, ifelse(weightgt;57 amp; weightlt;=64, 3, ifelse(weightgt;64 amp; weightlt;=75, 4, 5)))))) hoodie_data = cbind(hoodie, data) cor(hoodie_data[, c(2:4)]) # height weight shoe_size # height 1.0000000 0.8126724 0.8707172 # weight 0.8126724 1.0000000 0.9512942 # shoe_size 0.8707172 0.9512942 1.0000000 # use one of the independent variables linear_model lt;- lm(hoodie ~ weight,data = hoodie_data) summary(linear_model) # ... # Coefficients: # Estimate Std. Error t value Pr(gt;|t|) # (Intercept) -4.056250 0.592073 -6.851 2.07e-06 *** # weight 0.109375 0.008316 13.153 1.14e-10 *** # ...