2014-12-16 5 views
-2

Я пытаюсь запустить регрессию (lm) по группам данных (округов) в кадре данных. Тем не менее, я сначала хочу отфильтровать этот фрейм данных (dat), чтобы исключить некоторые группы с слишком небольшим количеством точек данных. Я получаю получить все, чтобы работать хорошо до тех пор, пока я не Подмножество фрейм данных первой:Ошибка в R Подстановка кадра данных, а затем использование sapply

tmp1 <- with(dat, 
    by(dat, County, 
     function(x) lm(formula = Y ~ A + B + C, data=x))) 
sapply(tmp1, function(x) summary(x)$adj.r.squared) 

я получить обратно, как и ожидалось:

Barrow Carroll Cherokee Clayton Cobb Dekalb Douglas

0.00000 NaN 0.61952 0.69591 0.48092 0.61292 0.39335

Однако, когда я первый подмножество кадра данных:

dat.counties <- aggregate(dat[,"County"], by=list(County), FUN=length) 
good.counties <- as.matrix(subset(dat.counties, x > 20, select=Group.1)) 
dat.temp <- dat["County" %in% good.counties,] 

, а затем запустить тот же код:

tmp2 <- with(dat, 
by(dat, County, 
    function(x) lm(formula = Y ~ A + B + C, data=x))) 
sapply(tmp2, function(x) summary(x)$adj.r.squared) 

Я получаю следующую ошибку: «$ operator недействителен для атомных векторов». Если я затем запустить summary(tmp2) я вижу следующее:

 Length Class Mode 

Barrow 0 -none- NULL

Carroll 0 -none- NULL

Cherokee 12 lm list

Clayton 12 lm list

sapply явно разбомбить на класс -отсутствует- объектов. Но это те, которые я исключил выше! Как они все еще появляются в моем новом кадре данных ?!

Благодарим вас за просвещение.

+1

Пожалуйста, сделайте ваш вопрос ** [воспроизводимый] (Http: // StackOverflow .com/вопросы/5963269/как в изготовлении, а-пре-р-воспроизводимый-пример) **. Гораздо легче помочь, когда вы это сделаете. Обратите внимание, что вы используете неправильный 'dat' в своей второй части кода (должен быть' dat.temp'), но я не думаю, что это проблема. – BrodieG

ответ

1

Некоторые части кода не ясны. Может быть, вы сделали attach набор данных. Кроме того, есть проблема использования неправильного dat вместо dat.temp как прокомментировал @BrodieG. Что касается ошибки, это может быть связано с тем, что столбец County равен factor, а levels не были сброшены. Вы можете попробовать

dat.temp1 <- droplevels(dat.temp) 
tmp2 <- with(dat.temp1, 
     by(dat.temp1, County, 
     function(x) lm(formula = Y ~ A + B + C, data=x))) 
sapply(tmp2, function(x) summary(x)$adj.r.squared) 

Вот пример, который воспроизводит ошибку

set.seed(24) 
d <- data.frame(
state = rep(c('NY', 'CA','MD', 'ND'), c(10,10,6,7)), 
year = sample(1:10,33,replace=TRUE), 
response= rnorm(33) 
) 

tmp1 <- with(d, by(d, state, function(x) lm(formula=response~year, data=x))) 
sapply(tmp1, function(x) summary(x)$adj.r.squared) 
#  CA   MD   ND   NY 
# 0.03701114 -0.04988296 -0.07817515 -0.11850038 

d.states <- aggregate(d[,"state"], by=list(d[,'state']), FUN=length) 
good.states <- as.matrix(subset(d.states, x > 6, select=Group.1)) 
d.sub <- d[d$state %in% good.states[,1],] 

tmp2 <- with(d.sub, 
    by(d.sub, state, 
     function(x) lm(formula = response~year, data=x))) 
sapply(tmp2, function(x) summary(x)$adj.r.squared) 
#Error in summary(x)$adj.r.squared : 
# $ operator is invalid for atomic vectors 

Если посмотреть на

tmp2[2] 
#$MD 
#NULL 

d.sub1 <- droplevels(d.sub) 
tmp2 <- with(d.sub1, 
     by(d.sub1, state, 
      function(x) lm(formula = response~year, data=x))) 
sapply(tmp2, function(x) summary(x)$adj.r.squared) 
#  CA   ND   NY 
# 0.03701114 -0.07817515 -0.11850038 
+0

спасибо akrun. капельницы сделали трюк. Я действительно привязал данные dataset ранее, но потом я отделил его и подумал, что все это вернет. И да, сожалею о неправильном «dat.temp», как отметил @BrodieG. –

Смежные вопросы