library(tidyverse)
install.packages("dplyr")
#问题一
#第一题 用if,else if分情况判别,roots是方程的解
get.root <- function(a,b,c){ #a*x^2 + b*x + c=0
if(a==0&&b== 0&&c==0 ){
roots <- NA
}else if(a==0&&b==0){
roots <- NULL}else if(
a==0){
roots <- -c/b}else{
discriminant <- b^2 - 4*a*c #判别式>=0时有实解
if(discriminant >= 0){
roots <- (-b + c(1,-1)*sqrt(discriminant))/(2*a)
}else{roots <- NULL}
}
return(roots)
}
#检测是否正确
get.root(0,0,0)
get.root(0,0,-3)
get.root(0,2,10)
get.root(1,2,0)
get.root(-1,5,8)
#第二题
get.prob <- function(a,b,c){ #a*x^2 + b*x + c=0
a <- runif(1,1,5)
b <- rnorm(1,mean = 3, sd = 10)
c <- rexp(1, 1/1)
discriminant <- b^2 - 4*a*c #判别式>=0时有实解
if(discriminant >= 0){
roots <- (-b + c(1,-1)*sqrt(discriminant))/(2*a)
}else{roots <- NULL}
return(roots)
}
get.prob()#输出随机的方程解
#求方程有解的概率
get.prob <- function(n)
a <- runif(n=10000,1,5) #runif均匀分布
b <- rnorm(n=10000,mean = 3, sd = sqrt(10)) #rnorm正态分布
#正态分布(3,10)中的10是指方差,而rnorm函数里面的sd是指标准差
#需要将方差变成标准差,在rnorm里使用sqrt(10)
c <- rexp(n=10000, 1)
d <- b^2 - 4*a*c
e <- sum(d>=0)/10000
e
#问题二 第一题
getwd()
setwd("~/Downloads/hw_lx") #设置工作路径
read.csv("file:///Users/kimwong17671672369/Downloads/hw_lx/data_for_HW2.csv", header = TRUE)
#读取并创建数据表
data1=data.frame(read.csv('data_for_HW2.csv', header = 1))
#查找缺失值
is.na(data1$price) #查看每一列的缺失值
table(is.na(data1$price))#2个缺失值
is.na(data1$marketshare)
table(is.na(data1$marketshare))#2个缺失值
is.na(data1$brand)
table(is.na(data1$brand))#2个缺失值
#排列
#分为四个排列,按照brand分类
arr1 <- filter(data1,brand ==1)
arrange(arr1,desc(marketshare),desc(price))
arr2 <- filter(data1,brand ==2)
arrange(arr2,desc(marketshare),desc(price))
arr3 <- filter(data1,brand ==3)
arrange(arr3,desc(marketshare),desc(price))
arr4 <- filter(data1,brand ==4)
arrange(arr4,desc(marketshare),desc(price))
#第二题求均值
mean(arr1$price,na.rm=TRUE)
mean(arr1$marketshare,na.rm=TRUE)
mean(arr2$price,na.rm=TRUE)
mean(arr2$marketshare,na.rm=TRUE)
mean(arr3$price,na.rm=TRUE)
mean(arr3$marketshare,na.rm=TRUE)
mean(arr4$price,na.rm=TRUE)
mean(arr4$marketshare,na.rm=TRUE)
#第三题 画散点图
ggplot(data=arr1)+
geom_point(mapping = aes(x=price, y=marketshare))
ggplot(data=arr2)+
geom_point(mapping = aes(x=price, y=marketshare))
ggplot(data=arr3)+
geom_point(mapping = aes(x=price, y=marketshare))
ggplot(data=arr4)+
geom_point(mapping = aes(x=price, y=marketshare))
#直接用facet_wrap作图
ggplot(data=data1,mapping=aes(x=marketshare,y=price),na.rm=TRUE)+
geom_point() +
facet_wrap(~brand)
#第四题 产生新变量
data1$price_new <- ifelse(
data1$price > mean(data1$price,na.rm=TRUE),c("高价格"),
c("低价格"))
data1$marketshare_new <- ifelse(
data1$marketshare > mean(data1$marketshare,na.rm=TRUE),c("高市场份额"),
c("低市场份额"))
view(data1)
#第五题 估计模型
data2 = na.omit(data1)#去除缺失值
ggplot(data=data2)+
geom_point(mapping = aes(x=price, y=marketshare))
library(modelr)
mod1 <- lm(marketshare ~ price, data = data2)
summary(mod1)
mod1
# marketshare = -0.36559x+0.03362
residuals(mod1)#显示残差
plot(data1$price,data1$marketshare)#绘图
abline(mod1)#添加拟合模拟直线
#geom_abline(intercept=0.03342,slope=-0.36171)
#第六题 随机直线验证拟合直线
#模拟点
options(na.action = na.warn)
model <- tibble(
a1 = runif(1000, -0.1, 0.1),
a2 = runif(1000, -2, 2)
)
#模拟线-geom_abline函数接受斜率和截距作为参数
ggplot(data1, aes(price,marketshare)) +
geom_abline(
aes(intercept = a1, slope = a2),
data = models, alpha = 1/4
) +
geom_point()
#函数-输入模型参数和数据,输出模型预测值
model1 <- function(a,data){
a[1] + data2$price *a[2]
}
model1(c(0.1,0.1),data2)
#均方根误差-计算预测值和实际值之间的总体距离
measure_distance <- function(mod, data) {
diff <- data2$marketshare - model1(mod, data)
sqrt(mean(diff ^ 2))
}
measure_distance(c(0.1,0.1), mod1)#测试函数
#挑选出最好的拟合直线
bestline <- optim(c(0,0),measure_distance,data=data2)
bestline$par
#使得到直线距离最短的参数为0.03362和-0.36586
#第八题
#二元一次函数可以解释多变量之间的线性关系
y = data2$marketshare
x1 = data2$price
x2 = data2$brand
mod2 <- lm(y ~ x1+ x2, data = data2)
mod2
summary(mod2)
#y= -0.401017x1-0.005304x2+0.048774