Полиномиальная регрессия (разные результаты - один и тот же набор данных, R против SPSS). пакет nnet - функция мултином - PullRequest
3 голосов
/ 24 апреля 2019

Недавно мне пришлось работать с R и SPSS, чтобы проанализировать набор данных с каркасом многочленной регрессии.Мы опросили некоторых участников (10–12 лет) и спросили, какое «профессиональное поле» им нравится больше всего , а затем спросили как часто они обращаются к Интернету .Таким образом, результатом является категориальная переменная »: профессиональная область -« военные »,« я не знаю »и« другая профессия », а независимая переменная также является категориальной переменной (как часто вы получаете доступ к Интернету («У меня нет доступа», «1-3 часа / день», «3-5 часов / день»).

Я запустил модель, используя R (с пакетом nnet с помощью функции многочлена ) и других статистиков, запущенных с использованием SPSS. Все справочные категории были определены правильно.

Теперь, когда мы сравниваем результаты, они не согласуются для второй категориимоя независимая переменная. Первая в порядке.

Пожалуйста, посмотрите весь код:

library(tidyverse)
library(stargazer)
library(nnet)

ds <- ds %>% mutate(internet = factor(internet))
ds <- ds %>% mutate(internet = relevel(internet, ref = "I dont have internet access"))

ds <- ds %>% mutate(field = factor(field))
ds <- ds %>% mutate(fielf = relevel(field, ref = "I dont know"))

mod <- multinom(field ~ internet, data = ds, maxit=1000, reltol = 1.0e-9)
stargazer(mod, type = 'text')

и результат SPSS SPSS results

Для ясности, когда независимая переменная имеет только две категории (например, пол, мужской и женский), R и SPSS согласуются с ее результатами

SPSS results 2

После огромных усилий, пытаясь понять несоответствие между обоими результатами, я прочиталхэт оценка сети может иметь некоторые проблемы (проблема оптимизации?), и что расхождение результатов не так странно, как я думал в начале ..

Может кто-нибудь объяснить мне, что здесь происходит?Чего мне не хватает ?!Я предполагаю, что SPSS и R должны иметь одинаковые результаты, если мы используем одну и ту же модель.

Спасибо

Это ds, которые я использую в этом примере:

ds <- structure(list(sex = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 
                                             2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 
                                             2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                             2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
                                             1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
                                             2L, 1L), .Label = c("male", "female"), class = "factor"), internet = structure(c(3L, 
                                                                                                                              3L, 2L, 3L, 2L, 3L, 3L, 3L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 3L, 2L, 
                                                                                                                              2L, 2L, 2L, 3L, 3L, 2L, 2L, 3L, 1L, 3L, 2L, 2L, 2L, 3L, 3L, 3L, 
                                                                                                                              2L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 
                                                                                                                              2L, 3L, 3L, 3L, 3L, 3L, 1L, 2L, 3L, 1L, 2L, 2L, 2L, 3L, 3L, 2L, 
                                                                                                                              2L, 1L, 3L, 2L, 2L, 3L, 2L, 2L), .Label = c("I dont have internet access", 
                                                                                                                                                                          "1-3 hours/day", "3-5 hours/day"), class = "factor"), field = structure(c(1L, 
                                                                                                                                                                                                                                                    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                                                                                                                                                                                                                                    1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                                                                                                                                                                                                                                    1L, 1L, 1L, 2L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 
                                                                                                                                                                                                                                                    1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
                                                                                                                                                                                                                                                    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("I dont know", "Military", 
                                                                                                                                                                                                                                                                                                "Other profession"), class = "factor")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                             -73L))

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете использовать mlogit в качестве альтернативы, которая более близка к результатам SPSS. Значения SPSS должны быть действительными, поскольку Stata дает аналогичные результаты (-14.88 (982.95), 11.58 (982.95), 11.44 (982.95)). Остальные отклонения могут быть связаны с нелепым значением «другой профессии».

library(mlogit)
ml.dat <- mlogit.data(ds, choice="field", shape="wide")
ml <- mlogit(field ~ 1 | internet, data=ml.dat)

Уступая

texreg::screenreg(ml)
=========================================================
                                                Model 1  
---------------------------------------------------------
Military:(intercept)                               -0.41 
                                                   (0.91)
Other profession:(intercept)                      -16.89 
                                                (2690.89)
Military:factor(internet)1-3 hours/day             -1.50 
                                                   (1.06)
Other profession:factor(internet)1-3 hours/day     13.60 
                                                (2690.89)
Military:factor(internet)3-5 hours/day             -1.64 
                                                   (1.06)
Other profession:factor(internet)3-5 hours/day     13.46 
                                                (2690.89)
---------------------------------------------------------
AIC                                                85.49 
Log Likelihood                                    -36.74 
Num. obs.                                          73    
=========================================================
*** p < 0.001, ** p < 0.01, * p < 0.05
...