[R] lm looking for weights outside of the user-defined function

Dimitri Liakhovitski dimitri.liakhovitski at gmail.com
Fri Oct 22 15:27:05 CEST 2010


As you suggested, David, the code below works.
Now I it can find the weights - because they are in the data frame x.
But how can I be sure now that it actually grabs the data from the
data frame "variables" and not the data frame x?

x<-data.frame(y=rnorm(100,0,1),a=rnorm(100,1,1),b=rnorm(100,2,1),myweights=runif(100))
names(x)

weighted.reg=function(formula, MyData, filename,WeightsVector)
{
	variables<-MyData[1:(length(MyData)-1)]    # creating a data frame
without the weights
	print(dim(MyData))
	print(filename)
	print(length(WeightsVector))
	regr.f<-lm(formula,variables,weights=WeightsVector,na.action=na.omit)
	results<-as.data.frame(round(summary(regr.f)$coeff,3))
	write.csv(results,file=filename)
	return(results)
}

reg2<-weighted.reg(y~., MyData=x, filename="TEST.csv",
WeightsVector=x$myweights)

Dimitri
On Fri, Oct 22, 2010 at 9:15 AM, David Winsemius <dwinsemius at comcast.net> wrote:
>
> On Oct 22, 2010, at 9:01 AM, Dimitri Liakhovitski wrote:
>
>> Dear R'ers,
>>
>> I am fighting with a problem that is driving me crazy. I use "lm" in
>> my user-defined function, but it seems to be looking for weights
>> outside of my function's environment:
>>
>> ### Generating example data:
>> x<-data.frame(y=rnorm(100,0,1),a=rnorm(100,1,1),b=rnorm(100,2,1))
>> myweights<-runif(100)
>> data.for.regression<-x[1:3]
>>
>> ### Creating function "weighted.reg":
>> weighted.reg=function(formula, MyData, filename,WeightsVector)
>> {
>>        print(dim(MyData))
>>        print(filename)
>>        print(length(WeightsVector))
>>        regr.f<-lm(formula,MyData,weights=WeightsVector,na.action=na.omit)
>>        results<-as.data.frame(round(summary(regr.f)$coeff,3))
>>        write.csv(results,file=filename)
>>        return(results)
>> }
>>
>> ### Running "weighted.reg" with my data:
>> reg2<-weighted.reg(y~., MyData=x, WeightsVector=myweights,
>> filename="TEST.csv")
>>
>>
>> I get an error: Error in eval(expr, envir, enclos) : object
>> 'WeightsVector' not found
>> Notice, that the function correctly prints length(WeightsVector). But
>> it looks like "lm" is looking for weights (in the 4th line of the
>> function) OUTSIDE the function and does not see WeightsVector.
>
> Have you tried putting WeightsVector in the "x" dataframe? That would seem
> to reduce the potential for environmental conflation.
>
> From the details section of help(lm):
> "All of weights, subset and offset are evaluated in the same way as
> variables in formula, that is first in data and then in the environment of
> formula."
>
>
>> Why is it looking outside the function for the object that has just
>> been defined inside the function?
>>
>
>
> David Winsemius, MD
> West Hartford, CT
>
>



-- 
Dimitri Liakhovitski
Ninah Consulting
www.ninah.com



More information about the R-help mailing list