2017-05-12 8 views
0

부트 기능을 사용하여 통계에 인수를 전달하는 데 문제가 있습니다. 다음 예는 다음과 같습니다 평가에서부트 패키지와 함께 가중치 회귀 (lm)를 사용하는 중에 발생한 문제 R

rm(list=ls()) 
library(faraway) 
library(boot) 
data(strongx) 
g3 <- lm(crossx ~ energy, strongx, weights=rep(1, nrow(strongx))) 

bootReg <- function(formulatostat, data, ind, weitostat) { 
    weig <- weitostat[ind] 
    fit <- lm(formula=formulatostat, data = data[ind, ], weights = weig) 
    return(coef(fit)) 
} 
wei <- rep(1, nrow(strongx)) 

bootResults <- 
    boot(
    data = strongx, 
    statistic = bootReg, 
    R = 2000, 
    formulatostat = crossx ~ energy, 
    weitostat = wei) 

오류 (EXPR, envir, enclos) : 물론

개체를 찾을 수 없습니다 'weig가'내 가중치가 1이고 그래서 가중 부분은 필요하지 않습니다. 그러나 실제 가중치를 사용하는 동안에도 문제가 남아 있습니다. 이것은 다른 데이터를 가지고있는 문제의 시연입니다. 부트 함수는 "더 이상의 인수는 ... 인수를 통해 통계로 전달 될 수 있습니다." 겉으로보기에는, formulatostat가 bootReg로 넘어 가고 있지만 가중치 비트가 아닙니다. 무게없이 비교하려면 :

bootReg <- function(formulatostat, data, ind) { 
    fit <- lm(formula=formulatostat, data = data[ind, ]) 
    return(coef(fit)) 
} 
wei <- rep(1, nrow(strongx)) 

bootResults <- 
    boot(
    data = strongx, 
    statistic = bootReg, 
    R = 2000, 
    formulatostat = crossx ~ energy) 

이것은 작동합니다. 무게를 통합하는 방법에 대한 조언을 주시면 감사하겠습니다.

+0

이이 사이트에 대한 주제 꺼져 있습니다. –

+0

crossvalidated에 오신 것을 환영합니다. 부트 매뉴얼 참조 : "첫 번째 인수는 항상 원래 데이터가되고, 두 번째 인수는 부트 스트랩 샘플을 정의하는 인덱스, 빈도 또는 가중치의 벡터가됩니다." >> "데이터"및 "ind"인수를 함수에서 1 위와 2 위로 전환하십시오. btw : 이것은 질문을 디버깅하기위한 올바른 포럼이 아닙니다 (통계적 문제이므로이 q가 곧 삭제 될 것입니다). + 실행중인 코드 (예제 데이터 포함)를 제공하면 나중에 좋은 대답을 얻을 수있는 가능성을 높일 수 있습니다. 환호 – mzunhammer

+0

사과. stats.stackexchange에 게시했습니다. 이 주제는 어떻게 꺼져 있습니까? 나의 무지를 유감스럽게 생각한다. 그러나 이것은 나의 처음 여기에서 게시 다. –

답변

0

data 인수로 주어진 객체 weig라는 객체를 찾고, 상기 화학식 (crossx ~ energy)가 정의되어있는 상위 환경에합니다 (lm 함수 내에서 호출되는)을 stats::model.frame 함수처럼 보인다.

weig이라는 열이 data에 지정된 data.frame 내에 없습니다. bootReg 함수 외부에 crossx ~ energy 수식을 정의 했으므로 lm 함수가 weig 개체를 찾지 못했습니다.

data 인수에 지정된 개체에 가중치를 추가하거나 lm 함수를 호출하는 것과 동일한 환경에서 수식 개체를 만들어 오류를 수정할 수 있습니다.

해결 방법 1 :

rm(list=ls()) 
library(faraway) 
library(boot) 
data(strongx) 
g3 <- lm(crossx ~ energy, strongx, weights=rep(1, nrow(strongx))) 

bootReg <- function(formulatostat, data, ind, weitostat) { 
    input_to_lm <- data[ind, ] 
    input_to_lm$weig <- weitostat[ind] 
    fit <- lm(formula=formulatostat, data = input_to_lm, weights = weig) 
    return(coef(fit)) 
} 
wei <- rep(1, nrow(strongx)) 

bootResults <- 
    boot(
    data = strongx, 
    statistic = bootReg, 
    R = 2000, 
    formulatostat = crossx ~ energy, 
    weitostat = wei) 

해결 방법 2 :

rm(list=ls()) 
library(faraway) 
library(boot) 
data(strongx) 
g3 <- lm(crossx ~ energy, strongx, weights=rep(1, nrow(strongx))) 

bootReg <- function(formulatostat, data, ind, weitostat) { 
    weig <- weitostat[ind] 
    fit <- lm(formula=as.formula(formulatostat), data = data[ind, ], weights = weig) 
    return(coef(fit)) 
} 
wei <- rep(1, nrow(strongx)) 

bootResults <- 
    boot(
    data = strongx, 
    statistic = bootReg, 
    R = 2000, 
    formulatostat = 'crossx ~ energy', 
    weitostat = wei)