Как создать линейную и Логистическую регрессионную модель в R?

#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 *** # ...